覆盖内置JavaScript对象上的成员

时间:2008-12-16 02:41:39

标签: javascript client-scripting

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

1 个答案:

答案 0 :(得分: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();

<强>更新 通过阅读您的说明here,我看到了您的错误:

  1. 您获得对象的引用 叫做myInnerContent
  2. 在替换外部标记的内容时从DOM中删除该对象。
  3. 你试图从孤儿和旧的对象中获取父母 不再在DOM中。 IE给你一个错误,Firefox给你null。
  4. 您的页面上已有解决方案:保存对象的名称。您可以选择在更新内容时更新全局变量,或者只更新内部div的innerHTML。