代码之家  ›  专栏  ›  技术社区  ›  CodeChef

重写内置javascript对象上的成员

  •  0
  • CodeChef  · 技术社区  · 16 年前

    我想重写所有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;
    };
    

    这是可能的吗?如果是,请张贴更正后的代码样本。谢谢!

    更新:

    @有些人感谢你的帮助。听起来这是不可能的。我把引起这个问题的问题扩展到了一个新的领域。 question 如果你感兴趣的话。

    1 回复  |  直到 15 年前
        1
  •  3
  •   some    16 年前

    据我所知,这是不可能的。 在firefox中,我得到一个例外:“设置一个只有getter的属性”,即给出错误,chrome给出错误,但在opera中,它是有效的(如果我把它赋给元素,而不是原型)!

    但你还有一个问题。offsetparent不是一个函数,因此它永远不会像函数那样被调用,并且您的警报也永远不会发生。在Opera(我找到的唯一一个可以替换它的浏览器)中,您只能恢复函数。

    但是,您可以添加一个新函数(将在firefox、chrome和opera中工作,但不在ie中工作,因为ie没有constructor属性):

    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. 您试图从旧对象中获取父对象,该对象是孤立的,并且 已经不在国内了。IE给你一个错误,而火狐给你一个空值。

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

    推荐文章