繁体   English   中英

覆盖内置JavaScript对象上的成员

[英]Override members on a built-in JavaScript object

我想覆盖所有ht​​ml元素的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谢谢您的帮助。 听起来这是不可能的。 如果您有兴趣,我会在一个新问题中扩展引发这个问题的问题

据我所知这是不可能的。 在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();

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

  1. 您获得对名为myInnerContent的对象的引用
  2. 您在替换外部标签的内容时从DOM中删除了该对象。
  3. 您尝试从孤立的旧对象中获取父对象,而该对象不再位于DOM中。 IE给您​​一个错误,而Firefox给您提供null。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM