Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript原型属性镜像另一个属性_Javascript_Internet Explorer 9_Prototype_Internet Explorer 10 - Fatal编程技术网

JavaScript原型属性镜像另一个属性

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文件来发送请

我们的内部网上有一系列针对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("//", ""));
}
然而,我现在遇到了将文本映射到文本内容的问题。以下内容似乎不起作用:

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-处理旧浏览器兼容性的更好方法是将代码更改为使用新的界面(在新浏览器中工作),然后为旧浏览器添加多边形填充。这将保持您的代码标准,防止将来发生冲突,因为您只在代码中使用标准属性,并使您的代码更易于将来的后续人员理解(因为它使用已知的标准)。您正在做相反的事情——对旧的专有接口进行编码,并试图使新浏览器仍然实现这一点。