2

一部のノードが親から削除される前にアラートを表示するために、removeChild などの標準 DOM 関数を置き換えることはできますか? そのようなものですが、私の例にはエラーがあります

var original = node.removeChild;
node.removeChild = function(node, original){
    alert('message');
    original(node);
}
4

4 に答える 4

1

私は急進的になり、ノーと言います。気になるブラウザーで技術的には機能し、prototype.js の基礎となる場合もありますが、このように DOM オブジェクトやそのプロトタイプを変更することは絶対にしないでください。

このトピックに関する長い投稿があります: http://perfectionkills.com/whats-wrong-with-extending-the-dom/しかし、TL;DR は、これらは「ホストされたオブジェクト」であり、その動作の変更は保証されていないということです。 . 今日はブラウザ x で動作する可能性がありますが、ブラウザ y や明日の x については保証されません。

于 2013-04-22T14:02:26.410 に答える
1

まず、newキーワードの使い方が完全に間違っています。それによって行動が大きく変わります。すべての JavaScript 関数の「母体」でfunctionある のインスタンスです。Function

キーワードを使用するnewと、関数はすぐに実行され、動作は予想とは大きく異なります。関数オブジェクトの作成方法の詳細については、ECMA 言語仕様のセクション 13を参照してください。こちらの 98 ページをお読みください。

次に、ネイティブ オブジェクトを変更しないことを強くお勧めしますprototype。それは、人類の歴史の中で最も退屈で痛みを伴うバグにつながります. コードを編集するためにあなたの後にやってくる人は、そのアラートの発信元を突き止めるまでに長い時間を費やします。

これら 2 つのアクションは別々にしてください。これらはまったく無関係です。それらを関数にラップすることはprototype、上記の理由により、非常に悪い設計です。たとえば、次のようになります。

  1. for inループの使用。を使用するのを忘れた場合に必要な、より多くのプロパティを反復処理しますhasOwnProperty
  2. あなた自身と他の開発者は、基本的な DOM ノードの削除操作が発生したときにランダムなことが起こっている理由を理解するのに苦労するでしょう (忘れるでしょう、誰にでも起こることです)。
于 2013-04-22T13:31:38.290 に答える