document.getElementsByClassName的理想实现
2014-01-02 12:18
531 查看
document.getElementsByClassName的理想实现
各种实现方式
Pure DOM
通常先使用getElementsByTagName("*")取出文档中所有元素,然后进行遍历,使用正则表达式找出匹配的元素放入一个数组返回。由于IE5不支持document.getElementsByTagName("*"),要使用分支document.all以防错误。The Ultimate getElementsByClassName方案,作者为Robert Nyman,05年实现,可见老外许多东西在很早以前就走得很远了。
DOM Tree Walker
使用document.createTreeWalker,这是个比较不常用的二级DOM方法。可惜IE全系列歇菜。XPath
更加新式时髦的技术。下面取自Prototype.js框架。
各主流游览器的支持情况 | ||||||||
---|---|---|---|---|---|---|---|---|
IE8 | IE7 | IE6 | FF3 | FF2 | Saf3 | Op9 | Op10 | Chrome |
N | N | N | Y | N | Y | Y | Y | Y |
速度比较一览
综合以上方案,我得出了一个最理想的实现——兼容IE5,让后面两个参数是可选的,能原生的原生,利用字面量与倒序循环提高效率……
<h2 class="red cell title">安装支持</h2> <span class="cell red ">jjj</span> <div class="filament_table red cell">这是DIV</div> #利用 var dd = getElementsByClassName("cell red") ,这三个元素都应该能被检索到!
因此,最最终的方案为:
var getElementsByClassName = function (searchClass, node,tag) { if(document.getElementsByClassName){ var nodes = (node || document).getElementsByClassName(searchClass),result = []; for(var i=0 ;node = nodes[i++];){ if(tag !== "*" && node.tagName === tag.toUpperCase()){ result.push(node) } } return result }else{ node = node || document; tag = tag || "*"; var classes = searchClass.split(" "), elements = (tag === "*" && node.all)? node.all : node.getElementsByTagName(tag), patterns = [], current, match; var i = classes.length; while(--i >= 0){ patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s|$)")); } var j = elements.length; while(--j >= 0){ current = elements[j]; match = false; for(var k=0, kl=patterns.length; k<kl; k++){ match = patterns[k].test(current.className); if (!match) break; } if (match) result.push(current); } return result; } }
相关文章推荐
- document.getElementsByClassName的理想实现
- document.getElementsByClassName的理想实现(@司徒正美 大神)
- document.getElementsByClassName的理想实现
- document.getElementsByClassName 的理想实现
- document.getElementsByClassName的理想实现
- document.getElementsByClassName的理想实现
- 【转】document.getElementsByClassName的理想实现
- document.getElementsByClassName的理想实现
- getElementsByClassName的理想实现
- document.getElementsByName 、document.getElementById 在IE与FF中有着不同实现。
- document.getElementsByName & document.getElementById 在IE与FF中不同实现
- document.getElementById(), getElementsByname(),getElementsByClassName(),getElementsByTagName()
- ie8及其以下浏览器的document.getElementsByClassName兼容性问题
- document.getElementsByClassName在ie8及其以下浏览器的兼容性问题
- IE不兼容document.getElementsByClassName
- 实现ES5以下兼容,Object.create()、getElementsByClassName()
- Prototype学习——工具函数($H,$R,Try.these,document.getElementsByClassName)
- IE6,7,8浏览器不支持 document.getElementsByClassName
- IE8以下浏览器不支持document.getElementsByClassName() 访问节点;怎么解决?---封装自己的类名
- document.getElementsByClassName兼容问题