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では「ゲッターのみを持つプロパティを設定する」という例外が発生し、IEではエラーが発生し、Chromeではエラーが発生しますが、Operaでは機能します(プロトタイプではなく要素に割り当てた場合)!

しかし、別の問題があります。offsetParent は関数ではないため、関数のように呼び出されることはなく、アラートは発生しません。オペラ(私が見つけた唯一のブラウザで、それを置き換えることができます)では、関数を元に戻すだけです。

ただし、新しい関数を追加することはできます (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 のみを更新するかを選択できます。

于 2008-12-16T03:24:14.253 に答える