2011-07-22 15 views
4

私はかなり単純なシナリオを持っています。対応するJSでDOMSubtreeModifiedイベントでのバブリングを止めるには?

<h1>Hello</h1> 
<input type="button" value="Change" id="change" /> 

:私は、次のHTMLを持って

var h1 = $("h1").get(0); 

h1.addEventListener("DOMSubtreeModified", function(ev) { 

    console.log("Changed"); 

    ev.bubbles = false; 
    ev.cancelBubble = true; 
    ev.defaultPrevented = true; 
    ev.preventDefault(); 
    ev.stopPropagation(); 
    ev.returnValue = false; 

    return false; 

}, false); 

$("#change").click(function() { 
    $("h1").text("World"); 
}); 

だから、これは基本的にはH1ノードのテキストを変更し、イベントが、その後解雇されます。しかし、イベントは2回発砲しています(私はバブリングの結果として想定しています)。ご覧のとおり、私はそれを2回発射しないようにするためにすべてを投げてみましたが、それで止めません。コードを試してみたい場合は、http://jsfiddle.net/sECtq/でチェックできます。どんな助けもありがとう。ありがとう。

+0

'ev.preventDefault();' IEが例外 – qwertymk

答えて

7

この現象は、バブリングが原因ではありません。あなたは2を取得するので、

両方の手順はDOMSubtreeModifiedをトリガー新しいtextNodeを挿入し、既存の内容を削除します。

$の.text()は、新しいテキストを設定するには2つのステップを実行しアラート。

$("h1")[0].firstChild.data="World"; 

これは、ノードを削除せずにtextNodeの内容を変更するだけです。

+0

Dohをスローする原因になります。非常に素晴らしい。私は今まで知らなかった。なぜテキストが2ステップのプロセスを使用するのか不思議です。私はあなたが提供したサンプルがこれを一つのステップに凝縮しているようです... – naivedeveloper

+1

私の提案ではtextNodeは1つしかないと仮定していますが、jQueryのtext()は内容全体を置き換えます。そのため、jQueryはまずempty()メソッドを使用してこれらのノードを削除し、メモリリークを回避します。 –

関連する問題