【问题标题】:JavaScript getElementById function overloadJavaScript getElementById 函数重载
【发布时间】:2011-07-28 07:32:49
【问题描述】:

我对旧网站有疑问。它上面的所有 JavaScript 代码都使用 getElemenById 函数。但是站点标记的标签没有 id 属性,而是只有 name 属性。虽然它仍然适用于 IE,但浏览器甚至通过 name 属性返回元素。对于所有其他浏览器,这是 JS 中的错误。 不知道有没有办法在其他浏览器中重载这个功能,使网站与其他浏览器兼容?

【问题讨论】:

  • 修复代码以使其正常工作可能会更好,而不是尝试破解该方法以在其他浏览器上以不同方式工作。您可以使用getElementsByName 方法按名称查找元素,尽管这会返回一个数组,因为名称不像 ID 那样是唯一的。

标签: javascript overloading


【解决方案1】:

没有办法在 JavaScript 中“重载”一个函数,就像在 Java 或 C 等强类型语言中那样。事实上,JavaScript 中的每个函数在这个意义上都已经重载,因为你可以使用任意数量和类型的参数调用任意函数。

但是,您可以做的是在现有版本之前插入您自己的代理,并使用您喜欢的任何行为来实现代理。例如:

document._oldGetElementById = document.getElementById;
document.getElementById = function(elemIdOrName) {
    var result = document._oldGetElementById(elemIdOrName);
    if (! result) {
        var elems = document.getElementsByName(elemIdOrName); 
        if (elems && elems.length > 0) {
            result = elems[0];
        }
    }

    return result;
};

【讨论】:

  • 谢谢。这对我来说是最好的。
  • 对于因为收到Illegal target invocation 而来到这里的人,诀窍是将getElementById 函数备份到文档对象本身,然后它可以访问它(这正是这篇文章的做法) .
【解决方案2】:

我不会指望覆盖getElementById 正常工作。听起来很容易进行类似这样的搜索和替换:

// Replace
document.getElementById("foo");
// With
myGetElementById("foo", document);

// Replace
myElement.getElementById("foo");
// With
myGetElementById("foo", myElement);

然后您可以根据需要myGetElementById,而不必担心旧 IE 中可能发生的情况以及覆盖 getElementById 时会发生的情况。

【讨论】:

    【解决方案3】:

    尝试 getElementsByName。这用于获取关于其名称的元素集合

    【讨论】:

    • 谢谢。我知道,但是对于这个旧网站来说,工作量很大。我只是需要一个解决方法。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多