0

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

4

1 回答 1

3

据我所知,这是不可能的。在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 给你一个空值。

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

于 2008-12-16T03:24:14.253 回答