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

时间:2015-12-11 19:41:05

标签: javascript internet-explorer-9 prototype internet-explorer-10

我们在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我会非常感激,我真的不想跟踪所有这些形式。谢谢!

1 个答案:

答案 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;
        }
    }
});