JavaScript原型属性镜像另一个属性
我们的内部网上有一系列针对IE9编码的表单,其中包含类似以下代码:JavaScript原型属性镜像另一个属性,javascript,internet-explorer-9,prototype,internet-explorer-10,Javascript,Internet Explorer 9,Prototype,Internet Explorer 10,我们的内部网上有一系列针对IE9编码的表单,其中包含类似以下代码: var dept = req.responseXML.selectNodes("//Dept")[0].text; 我们刚刚将所有PC升级到IE10,selectNodes现已过时,并已被querySelectorAll取代,因此正确的代码位为: var dept = req.responseXML.querySelectorAll("Dept")[0].textContent; 所有这些表单都使用一个共享的JS文件来发送请
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("//", ""));
}
然而,我现在遇到了将文本映射到文本内容的问题。以下内容似乎不起作用:
Element.prototype.text = function() {
return this.textContent;
};
如果有人有任何建议,我将不胜感激,我真的不想追踪所有这些表格。谢谢 为了避免修复代码,您确实应该修复代码,而不是攻击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;
}
}
});
这就是解决办法!您的建议是正确的,但是“我的环境”要求旧的IE9代码在IE10中仍能正常工作。@JaredFeldman-处理旧浏览器兼容性的更好方法是将代码更改为使用新的界面(在新浏览器中工作),然后为旧浏览器添加多边形填充。这将保持您的代码标准,防止将来发生冲突,因为您只在代码中使用标准属性,并使您的代码更易于将来的后续人员理解(因为它使用已知的标准)。您正在做相反的事情——对旧的专有接口进行编码,并试图使新浏览器仍然实现这一点。