昨天在做一个点击展开关闭效果的时候,为了方便重用,不考虑通过id来取得元素,而是通过可重用的class来取得元素。可是底层的js并不提供这个方法。一开始看YUI的api,看到有相关的方法,叫做getAncestorByClassName(),在本地试了下,虽然比不上jq的parents()方法好用,不过,也还算可以了。很顺利地完成了我想要的效果,可是传到网上去以后,却发现不能用。因为线上的YUI库是个版本比较老的版本,我猜很可能是还不支持这个方法。没办法,今天自己封装了个函数,提供同样的功能。

 

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>无标题文档</title>

</head>

<script type="text/javascript">

var getAncestorByClassName = function(node,oClassName){

   var obj = typeof node == "string" ? document.getElementById(node):node;

   while(obj.parentNode!=document){

    if(obj.parentNode.className==oClassName){

     return obj.parentNode;

    }else{

     obj = obj.parentNode;

    }

   }

   return null;

}

window.onload = function(){

   var test = document.getElementById("test");

   test.onclick=function(){

    var adang = getAncestorByClassName(this,"adang");

    alert(adang.title);

   }

}

</script>

<body>

<div class="adang" title="hello" id="demo">

<ul class="adang2" title="world">

   <li>

    <p>

     <a href="#" id="test">test</a>

    </p>

   </li>

</ul>

</div>

</body>

</html>


函数getAncestorByClassName 接收两个参数,第一个为元素节点,类型为DOM节点元素或者是对象的id都可以,第二个为想要取得的父节点的class名。返回值类型是DOM节点元素,如果没有找到,则返回null。这个例子很简单,可以举一返三写出通过 class名返回子节点元素等等功能,我就不多写了。