YAHOO.util.Dom.getElementsByClassName的一点小改进~
由于昨天遇到的一个问题,才有了这种想法。目前的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’)。
这篇文章发布于 2009年04月14日,星期二,07:46,归类于 编码。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback。
其实 getElementsByClassName 支持正则表达式操作,相关代码
所以可得出 className 可以是正则表达式的一部分,那么去多个就很好搞定了。 :^)
注意,YUI 2.7.0 里getElementsByClassName()的第一个参数支持正则表达式,所以,你可以直接这么调用:
YAHOO.util.Dom.getElementsByClassName(/hehe|haha|heihei/)。
try it!
妈的,被抢沙发了!
单独提一个局部小问题:
//剔除相同的节点
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); } }
}
这段代码跑起来,如果真的有相同节点的话会出错的。一般遍历去剔除列表里的元素要从后往前遍历。
@小马 @明城 感谢哈。。我记得上次小马有说。。我当时还看了。。。然后就忘了。。。丢人了哈~
@遇春 感谢指正哈~
我觉得用半角逗号更符合习惯一点,呵呵~~~