【问题标题】:Override members on a built-in JavaScript object覆盖内置 JavaScript 对象的成员
【发布时间】:2008-12-16 02:41:39
【问题描述】:

我想覆盖所有 html 元素的 offsetParent 成员的默认行为。如果可能的话,我想做这样的事情:

// For <div id="foo"></div>
var oFooElem = document.getElementById("foo");
oFooElem._offsetParent = oFooElem.offsetParent;
oFooElem.prototype.offsetParent = function() {
    window.status = 'offsetParent called.';
    return this._offsetParent;
};

这甚至可能吗?如果是这样,请发布更正后的代码示例。谢谢!

更新:

@some 谢谢你的帮助。听起来这是不可能的。如果您有兴趣,我已经在新的question 中扩展了引发此问题的问题。

【问题讨论】:

  • 当我在 firefox 中尝试时,出现异常“对 WrappedNative 原型对象的非法操作”。
  • 您不能在 offsetParent 属性 AFAIK 上执行此操作。你希望完成什么?例如您是否试图在层次结构中获得真正的上/左坐标?
  • 我希望彻底解决这个问题。 weblogs.asp.net/rajbk/archive/2006/11/29/…
  • @CodeChef:我更新了我的答案,并在其他网站上发布了回复。

标签: javascript client-side


【解决方案1】:

据我所知,这是不可能的。 在 Firefox 中我得到异常“设置一个只有 getter 的属性”,IE 给出错误,Chrome 给出错误,但在 Opera 中它可以工作(如果我将它分配给元素,而不是原型)!

但是你还有另一个问题。 offsetParent 不是一个函数,因此它永远不会像函数一样被调用,并且您的警报将永远不会发生。在 opera(我发现的唯一可以替换它的浏览器)中,您只能恢复该功能。

但是您可以添加一个新函数(在 Firefox、Chrome 和 Opera 中有效,但在 IE 中无效,因为 IE 没有构造函数属性):

var e = document.getElementById("mydiv"); //Get a div element
//Adds a _offsetParent function to all DIV elements.
e.constructor.prototype._offsetParent=function(){
  alert("offset parent called"); return this.offsetParent;
};
e._offsetParent();

更新 通过阅读您的描述here 我看到了您的错误:

  1. 你得到一个对象的引用 称为 myInnerContent
  2. 当您替换外部标记的内容时,您从 DOM 中删除了该对象。
  3. 您尝试从孤立的旧对象中获取父对象,并且 不再在 DOM 中。 IE 给你一个错误,而 Firefox 给你一个 null。

您的页面上已经有了解决方案:保存对象的名称。可选地,您可以选择在更新内容时更新全局变量,或者只更新内部 div 的 innerHTML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多