【问题标题】:JavaScript Prototype Property Mirror Another PropertyJavaScript 原型属性镜像另一个属性
【发布时间】:2016-03-17 19:45:51
【问题描述】:

我们的 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;
};

如果有人有任何建议,我将不胜感激,我真的不想追踪所有这些表格。谢谢!

【问题讨论】:

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


    【解决方案1】:

    看起来你真的应该修复你的代码而不是破解 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 - 处理旧浏览器兼容性的更好方法是更改​​代码以使用新界面(在新浏览器中工作),然后为旧浏览器添加 polyfill。这使您的代码保持标准,防止将来发生冲突,因为您只在代码中使用标准属性,并使您的代码更容易被将来追随您的人理解(因为它使用已知标准)。您正在做相反的事情 - 对旧的专有接口进行编码并试图让新的浏览器仍然实现它。
    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 2017-04-27
    • 1970-01-01
    • 2019-11-15
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多