将getElementsByClassName还原为原始浏览器版本

时间:2014-06-27 06:16:10

标签: javascript

我正在开发一个现有的网页,其中包含我无法编辑的各种JavaScript。我只能访问页面的某个部分来完成我的工作。现在的问题是使用jQuery。之前的开发人员使用自定义版本修改了getElementsByClassName方法,我假设它是IE的polyfill。但是这会破坏在支持的浏览器上使用getElementsByClassName的jQuery。

现在,在执行代码之前,如何将getElementsByClassName恢复为原始版本。我无法在网上找到原始方法。不使用jQuery实际上不是一个选项,因为我正在尝试集成用jQuery编写的大部分代码。

感谢。

3 个答案:

答案 0 :(得分:3)

由于document的原型链未被更改,您可以通过删除当前实现来恢复它,如评论中所述:

delete document.getElementsByClassName;

Demo

这将通过原型链再次提供实现。

旧答案

您可以尝试使用此黑客恢复它:

document.getElementsByClassName = document.documentElement.getElementsByClassName
    .bind(document.documentElement);

我不确定它是否有任何缺点。

答案 1 :(得分:1)

如果您需要getElementsByClassName()的实现,您可以编写如下内容:

document.getElementsByClassName=function (theclass) {
els=document.getElementsByTagName("*")
temp=[]
for (var k=0; k<els.length; k++) {
if(els[k].className==theclass){
temp.push(els[k])
        }
    }
return temp;    
}

这里有一个很好的讨论,你可以参考:http://www.webdeveloper.com/forum/showthread.php?256068-Need-object-getElementsByClassName-snippet

答案 2 :(得分:0)

编辑,考虑到杰克对此答案的第一次评论,以及他编辑的答案:

从原型链中删除getElementsByClassName并因此自动恢复到原始函数显然本身有效,但这确实留下了IE8,它不支持getElementsByClassName

此脚本非常接近原始函数,考虑了多个类,现在正确处理连字符,并使IE8也支持它:

document.getElementsByClassName = function(theClass) {
    var elemArray = [];
    var elems = this.getElementsByTagName('*');
    for (var i=0; i<elems.length; i++) {
        var allClasses = elems[i].className;
        var classRegex = new RegExp('^('+theClass+')$|(\\s'+theClass+'\\b)');
        // pattern demo and explanation on http://regex101.com/r/pP8nS2
        if (classRegex.test(allClasses) == true)
            elemArray.push(elems[i]);
    }
    return elemArray;
}

关于http://codepen.io/anon/pen/Hhswl?editors=100的实时整页演示,正则表达式模式演示和http://regex101.com/r/pP8nS2的解释。

我知道的唯一限制是您不能以document.getElementById(id).getElementsByClassName(class)的连接形式使用此脚本。你应该使用document.getElementById(id).querySelectorAll(.class),这也是IE8(而不是7)支持的。注意点。