getElementsByClassName()在IE6,IE7,IE8等旧Internet Explorer中不起作用
以下代码:
var borderTds = document.getElementsByClassName('leftborder');
在Internet Explorer 6,7和8中给我一个错误消息:
对象不支持这种方法
如何在这些浏览器中select他们的类的元素?
我不喜欢使用JQuery。
这个解决scheme可能有帮 这是一个自定义getElementsByClassName
函数在纯JavaScript中实现,在IE中工作。
基本上这个脚本正在做的是逐个探索所有可能的select,并select最好的一个。 这些选项是:
- 本地
document.getElementsByClassName
函数。 -
document.evaluate
函数,它允许评估XPath查询。 - 遍历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函数或其他函数; }