我们在Intranet上编写了一堆用于IE9的表单,其中包含与此类似的代码:
var dept = req.responseXML.selectNodes("//Dept")[0].text;
我们刚刚将所有PC升级到IE10,selectNodes现已过时,已被querySelectorAll取代,因此修正后的代码位将为:
var dept = req.responseXML.querySelectorAll("Dept")[0].textContent;
所有这些表单都使用共享的JS文件发送请求,所以我想如果我可以定义一些原型函数/属性,我可以修复这种不兼容性而不触及每个表单。我取得了一些进展,并且能够使用以下方法将selectNodes映射到querySelectorAll:
Document.prototype.selectNodes = function(param) {
return this.querySelectorAll(param.replace("//", ""));
}
但是我现在遇到了将文本映射到textContent的问题。以下似乎不起作用:
Element.prototype.text = function() {
return this.textContent;
};
如果有人有任何adivce我会非常感激,我真的不想跟踪所有这些形式。谢谢!
答案 0 :(得分:0)
看起来您应该修复代码而不是破解DOM方法,以避免修复代码。想象一下,随着时间的推移,这会如何积累,你的代码会越来越远离编程到标准DOM,然后在某些时候,你甚至可能会在浏览器中发生变化时发生名称冲突。
如果你想破解代码以便elem.text
返回elem.textContent
,那么因为这些是属性引用,而不是函数调用,你需要使用这样的getter:
Object.defineProperty(HTMLElement.prototype, "text", {
get: function() {
return this.textContent || this.innerText;
},
set: function(txt) {
if (this.textContent) {
this.textContent = txt;
} else {
this.innerText = txt;
}
}
});