如何理解 “document.getElementsByClassName=vb function如何使用”

357450 - Implement getElementsByClassName
If you think a bug might affect users in the 57 release, please .
Implement getElementsByClassName
Implement getElementsByClassName
in mozilla1.9
enhancement
mozilla1.9
Dependency
Bug Flags:
|   |
Show Obsolete Attachments
View ▾
(Assignee)
CC: gavin.sharp
CC: asqueella
(Assignee)
(Assignee)
OS: Mac OS X 10.3 & AllHardware: PC & AllSummary: getElementsByClassName & Implement getElementsByClassName
(Assignee)
OS: All & Mac OS X 10.3Hardware: All & PC
OS: Mac OS X 10.3 & AllHardware: PC & All
CC: bugzilla
(Assignee)
Assignee: general & sayrer
CC: bzbarsky
CC: piratepenguin
(Assignee)
(Assignee)
(Assignee)
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
Flags: review?(jst)
(Assignee)
(Assignee)
(Assignee)
(Assignee)
Flags: review?(jst)
CC: jwalden+bmo
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
(Assignee)
Flags: review?(jst)
Flags: review?(jst) & review-
(Assignee)
CC: fullmetaljacket.xp
CC: brendan
(Assignee)
Attachment is obsolete: true
(Assignee)
Attachment is obsolete: true
Flags: review?(jst)
(Assignee)
Attachment is obsolete: true
Flags: review?(jst)
Flags: review?(jst)
(Assignee)
Attachment is obsolete: true
Flags: review?(jst)
Flags: review?(jst)
CC: mnordhoff
Flags: review?(jst) & review+
(Assignee)
(Assignee)
Attachment is obsolete: true
Flags: superreview?(bzbarsky)
Flags: superreview?(bzbarsky) & superreview?(peterv)
CC: taken.spc
CC: unknown
Flags: superreview?(peterv) & superreview+
(Assignee)
(Assignee)
Attachment is obsolete: true
(Assignee)
Status: NEW & RESOLVEDLast Resolved: Resolution: --- & FIXED
Flags: in-testsuite?
Flags: in-testsuite? & in-testsuite+
(Assignee)
(Assignee)
Depends on:
CC: BijuMailList
Depends on:
Depends on:
Depends on:
Depends on:
Depends on:
Depends on:
No longer depends on:
Status: RESOLVED & VERIFIEDTarget Milestone: --- & mozilla1.9
Format Bug ▴各种实现方式
通常先使用getElementsByTagName("*")取出文档中所有元素,然后进行遍历,使用正则表达式找出匹配的元素放入一个数组返回。由于IE5不支持document.getElementsByTagName("*"),要使用分支document.all以防错误。
The Ultimate getElementsByClassName方案,作者为Robert Nyman,05年实现,可见老外许多东西在很早以前就走得很远了。
//三个参数都是必需的,查找一网页中5007个类名为“cell”的元素,IE8历时1828 ~ 1844毫秒,
//IE6为4610 ~ 6109毫秒,FF3.5为46 ~ 48毫秒,opera10为31 ~ 32毫秒,Chrome为23~ 26毫秒,
//safari4为19 ~ 20毫秒
function getElementsByClassName(oElm, strTagName, strClassName){
var arrElements = (strTagName == "*" && oElm.all)? oElm.all :
oElm.getElementsByTagName(strTagName);
var arrReturnElements = new Array();
strClassName = strClassName.replace(/\-/g, "\\-");
var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
for(var i=0; i & arrElements. i++){
oElement = arrElements[i];
if(oRegExp.test(oElement.className)){
arrReturnElements.push(oElement);
return (arrReturnElements)
另一个实现,由Dustin Diaz(《JavaScript Design Patterns》的作者)提供,但兼容性不如上面的,不支持IE5。
//后两参数是可靠的,查找一网页中5007个类名为“cell”的元素,IE8历时78毫秒,IE6历时125~171毫秒
//FF3.5为42 ~ 48毫秒,opera10为31 毫秒,Chrome为22~ 25毫秒,safari4为18 ~ 19毫秒
var getElementsByClass = function(searchClass,node,tag) {
var classElements = new Array();
if ( node == null )
if ( tag == null )
tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
for (i = 0, j = 0; i & elsL i++) {
if ( pattern.test(els[i].className) ) {
classElements[j] = els[i];
return classE
还有个更古老级的,我从prototype.js1.01版本中找到的,它能支持多个类名的查找(上面两个不行)。它不支持IE5,效率一般般,但作为最早的框架之一,它已经做得很好,其他框架还没有想到这个呢!
//由于这是后期添加的,测试页面已被我删掉,没有做测试……
function getElementsByClassName(className, element) {
var children = (element || document).getElementsByTagName('*');
var elements = new Array();
for (var i = 0; i < children. i++) {
var child = children[i];
var classNames = child.className.split(' ');
for (var j = 0; j < classNames. j++) {
if (classNames[j] == className) {
elements.push(child);
DOM Tree Walker
使用document.createTreeWalker,这是个比较不常用的二级DOM方法。可惜IE全系列歇菜。
//查找一网页中5007个类名为“cell”的元素,FF3.5为104 ~ 119毫秒,opera10为230 ~ 265毫秒,
//Chrome为119 ~ 128毫秒,safari为28 ~ 32毫秒
var getElementsByClassName = function(searchClass) {
function acceptNode(node) {
if (node.hasAttribute("class")) {
var c = " " + node.className + " ";
if (c.indexOf(" " + searchClass + " ") != -1)
return NodeFilter.FILTER_ACCEPT;
return NodeFilter.FILTER_SKIP;
var treeWalker = document.createTreeWalker(document.documentElement,
NodeFilter.SHOW_ELEMENT, acceptNode, true);
var returnElements = [];
if (treeWalker) {
var node = treeWalker.nextNode();
while (node) {
returnElements.push(node);
node = treeWalker.nextNode();
return returnE
更加新式时髦的技术。
下面取自Prototype.js框架。
document.getElementsByClassName = function(className, parentElement) {
if (Prototype.BrowserFeatures.XPath) {
var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
return document._getElementsByXPath(q, parentElement);
var children = ($(parentElement) || document.body).getElementsByTagName('*');
var elements = [],
for (var i = 0, length = children. i & i++) {
child = children[i];
if (Element.hasClassName(child, className))
elements.push(Element.extend(child));
由于这个是不能运行的,我们修改如下:
//查找一网页中5007个类名为“cell”的元素,FF3.5为33 ~ 48毫秒,opera10为31 ~ 32毫秒,
//Chrome为104 ~ 107毫秒,safari为18 ~ 21毫秒
var getElementsByClassName = function(searchClass,node,tag) {
node = node ||
tag = tag || '*';
var classes = searchClass.split(" "),
patterns = "",
xhtmlNamespace = "http://www.w3.org/1999/xhtml",
namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
returnElements = [],
for(var j=0, jl=classes. j& j+=1){
patterns += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
elements = document.evaluate(".//" + tag + patterns, node, namespaceResolver, 0, null);
catch (e) {
elements = document.evaluate(".//" + tag + patterns, node, null, 0, null);
while ((_node = elements.iterateNext()))
returnElements.push(_node);
return returnE
当然如果游览器原生支持,就用原生的。
各主流游览器的支持情况
IE8IE7IE6FF3FF2Saf3Op9Op10Chrome
速度比较一览
综合以上方案,我得出了一个最理想的实现——兼容IE5,让后面两个参数是可选的,能原生的原生,利用字面量与倒序循环提高效率……
//查找一网页中5007个类名为“cell”的元素,IE8历时1828 ~ 1844毫秒,
//IE6为125 ~ 172毫秒,IE8为93 ~ 94毫秒,FF3.5为0~1毫秒,opera10为0毫秒,Chrome为1毫秒,
//safari4为0毫秒
var getElementsByClassName = function(searchClass,node,tag) {
if(document.getElementsByClassName){
document.getElementsByClassName(searchClass)
node = node ||
tag = tag || '*';
var returnElements = []
(tag === "*" && node.all)? node.all : node.getElementsByTagName(tag);
var i = els.
searchClass = searchClass.replace(/\-/g, "\\-");
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
while(--i >= 0){
if (pattern.test(els[i].className) ) {
returnElements.push(els[i]);
return returnE
var collections = getElementsByClassName("red");
但它还是不如原生的getElementsByClassName,不能同时检索多个class
&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
node = node ||
tag = tag || "*";
var classes = searchClass.split(" "),
elements = (tag === "*" && node.all)? node.all : node.getElementsByTagName(tag),
patterns = [],
var i = classes.
while(--i &= 0){
patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s|$)"));
var j = elements.
while(--j &= 0){
current = elements[j];
for(var k=0, kl=patterns. k& k++){
match = patterns[k].test(current.className);
if (!match)
if (match)
result.push(current);众所周知,对于IE8以下的浏览器(IE8居然是WIN7预装的)没有document.getElementsByClassName,网上也有很多重写的方法,以下是本人在项目中所使用的方法document.getElementsByClassName = function (Name,e,tag) {
var ele = [],
if (typeof tag === "undefined" ){
if (typeof e === "undefined"){
allEle = e.getElementsByTagName(tag);
for (length = allEle.i &i = i + 1){
if (allEle[i].className === Name) {
ele.push(allEle[i]);
}解释下参数问题,首先我们使用的时候后2个参数是可选的,对于IE8以下的浏览器来说,遍历整个DOM树是非常消耗时间的,所以在一般情况下为这种浏览器我们需要一种定位的概念,就是指定后2个参数来更精确的其位置,以提升开发效率第二个参数是元素对象(element),指定你所找到的className元素的父元素第三个参数是标签名,指定你所要找的className的标签名&剩下,我就不多说了,大家看代码都能看懂了
阅读(...) 评论()js document.getElementsByClassName的使用介绍与自定义函数
投稿:mdxy-dxy
字体:[ ] 类型:转载 时间:
今天在增加一个功能的时候需要用到getElementsByClassName(),getElementsByClassName但是HTML5 新增的DOM API。IE8以下不支持,那么就需要下面的方法解决了
getElementsByClassName()是HTML5 新增的DOM API。IE8以下不支持搜索。
getElementByClassName()函数的使用方法:
使用JavaScript访问DOM的一个重大问题是,此过程需要一种通过元素类名称来选择类的类函数,对DOMContentReady,这种类函数的缺失导致开发人员需要自己编写自定义脚本业执行上述任务,许多这个类脚本都是围绕着getElementByClassName()建立的,这种解决方法在HTML5中被标准化,另外,这种方法还本地存在于现代浏览器中,GetElementByClassName()只使用一个字符串值作为输入.并返回一个Nodelist,这个NodeList包含所有类名称匹配这个字符串值的元素:
var el = document.getElementsByClassName('foo');
通过在字符串中使用空格分隔类,也可以匹配多个类,下面的代码挑选出了所有既拥有foo类名称又拥有bar类名称的元素:
var el = document.getElementsByClassName('foo bar');
W3C没有getElementByClassName这个函数,我们可以自己定义一个函数来模拟它。
一般如下几种方法:
1、要不就是使用jquery来实现
2、通过自定义函数解决
class单个时 如class="test"
function getElementsByClassName (className) {
var all = document.all &#63; document.all : document.getElementsByTagName('*');
var elements = new Array();
for (var e = 0; e & all. e++) {
if (all[e].className == className) {
elements[elements.length] = all[e];
function getElementsByClassName(className,parent){
var oParent=parent&#63;document.getElementById("parent"):
var oLis=oParent.getElementsByTagName("*");
var arr=[];
for(var i=0;i&oLis.i++){
if(oLis[i].className==className){
arr.push(oLis[i])
class有多个的时候同样匹配,如class="test1 test2 test3"
function getElementsByClassName (className) {
var all = document.all &#63; document.all : document.getElementsByTagName('*');
var elements = new Array();
for (var e = 0; e & all. e++) {
var classList = all[e].className.split(" ");
for(var i=0;i&classList.i++){
if (classList[i] == className) {
elements[elements.length] = all[e];
下面再附一个完整的测试代码:
&!DOCTYPE html&
&meta charset='UTF-8' /&
/*JS写getElementByClassN
我发现chorm、firefox、ie都支持document.getElementsByClassName */
window.onload = function(){
var adom = document.getElementsByClassName('a1');
for(var i = 0;i&adom.i++)
adom[i].style.backgroundColor="red";
function getElementByClassName(className){
var elems = [];
if(!document.getElementsByClassName){
alert("no exit");
var dom = document.getElementByTagName('*');
for(var i = 0;i&dom.i++){
if(dom[i].className == className)
elems.push(dom[i]);
elems = document.getElementsByClassName(className);
alert('exit');
&div id="a1"&a1&/div&
&div class="a1"&a1&/div&
&div class="a1"&a1&/div&
&div id="a1"&a1&/div&
&div class="a1"&a1&/div&
效果如图所示:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 function如何调用 的文章

 

随机推荐