YAHOO.util.Dom.getElementsByClassName的一点小改进~ at 2009.4.14 7:07
由于昨天遇到的一个问题,才有了这种想法。目前的YAHOO.util.Dom.getElementsByClassName仅支持一个class的寻找,如果我想寻找多个class的话就要多操作几次了,而且如果要给这些节点添加相同的事件的话,又要首先把它们放到一个数组,然后给新的数组添加事件,或者分别给各个数组添加事件,挺麻烦的,所以给YAHOO.util.Dom.getElementsByClassName做一点小改进,让它可以找到包含任何一个所给class的所有节点。
getElementsByClassName: function(className, tag, root, apply, o, overrides) {
className = lang.trim(className);
tag = tag || '*';
root = (root) ? Y.Dom.get(root) : null || document;
if (!root) {
return [];
}
var nodes = [],
elements = root.getElementsByTagName(tag),
hasClass = Y.Dom.hasClass;
if(className.indexOf('|')>0) {
var classnames = className.split('|');
//找到所有节点
for (var i = 0, len = elements.length; i < len; ++i) {
for (var j = 0; j < classnames.length; ++j) {
if ( hasClass(elements[i], lang.trim(classnames[j])) ) {
nodes[nodes.length] = elements[i];
}
}
}
//剔除相同的节点
for (var k = 0; k < nodes.length; k++) {
for(var l = k+1; l < nodes.length; l++) {
if(nodes[k] == nodes[l]) {
nodes.splice(l,1);
}
}
}
} else {
for (var i = 0, len = elements.length; i < len; ++i) {
if ( hasClass(elements[i], className) ) {
nodes[nodes.length] = elements[i];
}
}
}
if (apply) {
Y.Dom.batch(nodes, apply, o, overrides);
}
return nodes;
}
用法很简单,就是在class之间加上“|”,比如:YAHOO.util.Dom.getElementsByClassName(‘hehe|haha|heihei’)。