我们有getElementsByClassName在JavaScript?

就像在jQuery中,我们可以使用$(“。classname”),在JavaScript中也有类似的东西? 或者,如果我们没有这样的方法,那我该如何实现呢?
根据http://www.dustindiaz.com/getelementsbyclass/我将不得不遍历所有的标签,然后收集所有具有相同类的元素与指定。

有没有更好的解决scheme?

一些浏览器(例如Firefox 3支持getElementsByClassName) ,其他浏览器需要遍历所有标签,所以如果你想用一个函数来支持所有的浏览器,你应该使用迭代方法。

最好的解决scheme是使用jQuery或任何其他框架将使用最好的方法。

我将不得不遍历所有的标签,然后收集所有与指定的类相同的元素。

是。 但是,有几种方法可以从链接的页面改进function:

  • RegExp转义的类名传入,使它不会被类名中的标点符号破坏。 例如,调用getElementsByClassName('ab.cd')不应该匹配class="abxcd"

  • 定义getElementsByClassName的HTML5规范允许多个空格分隔的类名,所有这些名都必须存在于要匹配的元素上。 实施这个。

  • 可选地,允许传递标签名称的提示以缩小function必须查看的元素的数量,以用于只有一种types的标签受到影响的常见情况。 (这在真正的浏览器本地getElementsByClassName调用中不会做任何事情,所以不应该依赖它来过滤掉不需要的元素。)

示例实现:

 if (!('getElementsByClassName' in document)) { document.getElementsByClassName= function(classnames, taghint) { var exps= classnames.split(/\s+/).map(function(name) { name= name.replace(/([/\\^$*+?.()|[\]{}])/g, '\\$1'); return new RegExp('(^|\\s)'+name+'(\\s|$)'); }); var els= this.getElementsByTagName(taghint || '*'); var matches= []; for (var i= 0, n= this.length; i<n; i++) var el= els[i]; if (exps.every(function(exp) { return exp.test(el.className); })) matches.push(el); } return matches; }; } 

但是,这也使用了IE还没有的几个ECMAScript第五版(或JavaScript 1.6)数组方法,所以你也必须为这些方法添加回退实现:

 if (!('map' in Array.prototype)) { Array.prototype.map= function(mapper, that) { var other= new Array(this.length); for (var i= 0, n= this.length; i<n; i++) if (i in this) other[i]= mapper.call(that, this[i], i, this); return other; }; } if (!('every' in Array.prototype)) { Array.prototype.every= function(tester, that) { for (var i= 0, n= this.length; i<n; i++) if (i in this && !tester.call(that, this[i], i, this)) return false; return true; }; } 

不幸的是浏览器之间不一致。 如果你不需要所有的jQuery,但仍然想要做基于CSSselect器的select,看看jQuery使用的select器库Sizzle 。

getElementsByClassName另一个好的实现

混合XPath和DOM实现; 尽可能使用XPath。

 if (!('getElementsByClassName' in document)) { document.getElementsByClassName = function(className, parentElement) { if (Prototype.BrowserFeatures.XPath) { var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; return document._getElementsByXPath(q, parentElement); } else { var children = ($(parentElement) || document.body).getElementsByTagName('*'); var elements = [], child; for (var i = 0, length = children.length; i < length; i++) { child = children[i]; if (Element.hasClassName(child, className)) elements.push(Element.extend(child)); } return elements; } }; }​ 

PS:张贴在这里,因为我猜它比快速回答更快。 没有冒犯的意思 :)
从John Resig的getElementsByClassName速度比较中得到了这个结果

是的,你必须迭代来支持所有的浏览器。 如果你这样做的话,确保你利用浏览器内置的function:

 if(document.getElementsByClassName) { return document.getElementsByClassName(className); } else { // iterate } 

除此之外,我和乔臣在一起。 使用框架