getElementsByClassName()在IE6,IE7,IE8等旧Internet Explorer中不起作用

以下代码:

var borderTds = document.getElementsByClassName('leftborder'); 

在Internet Explorer 6,7和8中给我一个错误消息:

对象不支持这种方法

如何在这些浏览器中select他们的类的元素?

我不喜欢使用JQuery。

这个解决scheme可能有帮 这是一个自定义getElementsByClassName函数在纯JavaScript中实现,在IE中工作。

基本上这个脚本正在做的是逐个探索所有可能的select,并select最好的一个。 这些选项是:

  1. 本地document.getElementsByClassName函数。
  2. document.evaluate函数,它允许评估XPath查询。
  3. 遍历DOM树。

当然,第一个是性能最好的,但是后者在任何地方都可以使用,包括IE 6。

用法示例在页面上也是可用的,如下所示:

 getElementsByClassName("col", "div", document.getElementById("container")); 

所以函数允许3个参数:class(required),标签名称(可选,如果没有指定,则search所有标签),根元素(可选,如果未指定,则为文档)。

更新。 博客文章中链接的解决scheme托pipe在2016年1月closures的Google代码中,但作者已在GitHub上提供 。 赞扬flodin在评论中指出这一点。

IE6,Netscape 6+,Firefox和Opera 7+将在您的页面中复制以下脚本:

 document.getElementsByClassName = function(cl) { var retnode = []; var elem = this.getElementsByTagName('*'); for (var i = 0; i < elem.length; i++) { if((' ' + elem[i].className + ' ').indexOf(' ' + cl + ' ') > -1) retnode.push(elem[i]); } return retnode; }; 

该方法在IE6中不存在。 如果你想通过类来select元素,而不想使用一个库,你只需要遍历页面中的所有元素,然后在他们的className属性中检查这个类。

 function getElementsByClassName(className) { var found = []; var elements = document.getElementsByTagName("*"); for (var i = 0; i < elements.length; i++) { var names = elements[i].className.split(' '); for (var j = 0; j < names.length; j++) { if (names[j] == className) found.push(elements[i]); } } return found; } 

演示: http : //jsfiddle.net/kYdex/1/

Internet Explorer 8及更早版本不支持getElementsByClassName() 。 如果你只需要一个IE8的解决scheme,它支持querySelectorAll() ,你可以使用其中的一个。 对于较老的IE,你必须提供你自己的实现,而对于一些支持它的古代浏览器,你也可以使用运行XPathexpression式的evaluate()

这段代码提供了一个document.getElementsByClassName方法,如果它不存在,使用我描述的方法:

 if (!document.getElementsByClassName) { document.getElementsByClassName = function(search) { var d = document, elements, pattern, i, results = []; if (d.querySelectorAll) { // IE8 return d.querySelectorAll("." + search); } if (d.evaluate) { // IE6, IE7 pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]"; elements = d.evaluate(pattern, d, null, 0, null); while ((i = elements.iterateNext())) { results.push(i); } } else { elements = d.getElementsByTagName("*"); pattern = new RegExp("(^|\\s)" + search + "(\\s|$)"); for (i = 0; i < elements.length; i++) { if ( pattern.test(elements[i].className) ) { results.push(elements[i]); } } } return results; } } 

如果你不喜欢它,你可以使用你最喜欢的search引擎find一个不同的search引擎。

我知道你不要使用jQuery,但使用jQuery会给你一个最优雅的解决scheme之一。 只需在你的javascript代码中添加这个函数:

 function defineGetElementsByClassName() { // define 'getElementsByClassName' - isn't supported in IE web browser if (!document.getElementsByClassName) { document.getElementsByClassName = function (className) { return this.querySelectorAll("." + className); } } } defineGetElementsByClassName(); 

如果getElementsByClassname不支持是在一些旧的浏览器错误只是尝试var modal = document.getElementById('myModal'); modal.onclick = function(){然后通过使用getElementById modal.style.display =“none”执行任何onclick函数或其他函数; }