我正在开发一个现有的网页,其中包含我无法编辑的各种JavaScript。我只能访问页面的某个部分来完成我的工作。现在的问题是使用jQuery。之前的开发人员使用自定义版本修改了getElementsByClassName
方法,我假设它是IE的polyfill。但是这会破坏在支持的浏览器上使用getElementsByClassName
的jQuery。
现在,在执行代码之前,如何将getElementsByClassName
恢复为原始版本。我无法在网上找到原始方法。不使用jQuery实际上不是一个选项,因为我正在尝试集成用jQuery编写的大部分代码。
感谢。
答案 0 :(得分:3)
由于document
的原型链未被更改,您可以通过删除当前实现来恢复它,如评论中所述:
delete document.getElementsByClassName;
这将通过原型链再次提供实现。
您可以尝试使用此黑客恢复它:
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)支持的。注意点。