2012-08-11 5 views
5

私は、左側からスライドするサイドペインを持っていて、内容をget()で動的に追加しています。私は、ペインの外にあるすべてのクリックが関数をトリガーすることによって閉じられるようにしたい。私が読んだ他の質問に基づいて、私は次のコードを思いついた。jQuery on()とstopPropagation()

$('html').click(function() { 
    if (side_showing) { 
     close_side(); 
    } 
}); 

$(document).on("click", "#side", function(event) { 
    event.stopPropagation(); 
}); 

私はそれを動作させるように見えません。私はon()機能が起動されていることを知っていますが、event.stopPropagationはそうではありません。任意のヒント?

+0

あなたは実際には 'stopPropagation();'の意味を知っていますか?見てみましょうhttp://www.javascripter.net/faq/eventbubbling.htm#demo –

答えて

12

stopPropagation()は、委任されたイベント処理(イベントハンドラが親にある)では使用できません。

これは、デリゲートされたイベント処理が最初に機能するようにするイベントの伝播であるため、イベントハンドラが呼び出されるまでにイベントは既に伝播されています。

コードで発生することの順序は、ドキュメントオブジェクトまでのイベントの伝播で、イベントハンドラが呼び出されます。したがって、event.stopPropagation()に電話すると、イベントが既に伝播しているため何もしません。

親オブジェクトでイベントの伝播が行われないようにする必要がある場合は、委任されたイベント処理を使用できません。イベントハンドラをオブジェクト自体に直接割り当てる必要があるため、イベントが伝播する前にインターセプトすることができます。これらが動的に作成されたオブジェクトの場合は、イベントハンドラを作成した直後にイベントハンドラを割り当てる必要があります。

私が知っている唯一の他の解決策は、これらのイベントを表示したくないイベントハンドラを親オブジェクトに配置し、それらのイベントハンドラがあなたの#sideオブジェクトから発生したイベントを無視するようにすることです。

+0

解決策はありますか? – Harangue

+1

@ J4G - いくつかのオプションが私の答えに追加されました。 – jfriend00

+0

オブジェクトに.on( "クリック")を使用した後に.click()を使用できますか? – Harangue