0

親divのClickイベントで、次のようにオーバーレイdivを閉じる関数を返します。

$('div#overlayBackground').click(function() {
            return clicker();
        });

このdivの子要素はを使用.innnerHTMLして入力され、document.ready()子要素に次のようなクリック機能を与えます。

$('#CaptionTextArea').live('click', function(e) {
             e.stopPropagation();
        });

クリックしTextAreaてもオーバーレイが閉じないようにします。ただし、子要素clickは実行されず、代わりに親divclickが常に実行されます。助けに感謝します。

4

2 に答える 2

2

このメソッドは、ドキュメントレベル.live()でイベントハンドラーをバインドします。イベントがドキュメントにバブルすると、jQueryは指定した要素でイベントが発生したかどうかを確認します。したがって、イベントが発生した要素の近くに他のイベントハンドラーがバインドされていて、それらのハンドラーがイベントの伝播を停止した場合、ベースのハンドラーは呼び出されません。関数が戻ると、伝播が停止します。.liveclicker()false

代わりにこれを試すことができます:

$('div#overlayBackground').on("click", "#CaptionTextArea", function(e) {
    e.stopImmediatePropagation();
}).on("click", function(e) {
    return clicker();
});

つまり、.on()メソッドを使用してを置き換え.live()、イベントハンドラーが実際に他のクリックイベントと同じ親要素にバインドされるようにします。jQueryはバインドされた順序でイベントハンドラーを呼び出すため、この.live()置換が最初に呼び出されevent.stopImmediatePropagation()、2番目の置換が実行されないようにするために使用できます。

于 2012-09-03T01:37:04.143 に答える
2

.live()はjQueryライブラリで非推奨になっているため、使用しないでください。その理由の1つは、イベントを処理するためにルートレベルまで伝播する必要があるため、そこstopPropagationでは役に立たないことです。より良い解決策は、同じ親クリックハンドラーでケースを処理することです。

$('div#overlayBackground').click( function(e) {
    if( e.target.id != 'CaptionTextArea' )
        return clicker();
});

#CaptionTextArea(a )には、クリックイベントの伝播元となる子がないため、これ<textarea>は問題なく機能します。ただし、一般的には、その子孫からのイベントも処理する必要があります。

// ignore clicks which originated within #CaptionTextArea
if( $(e.target).closest('#CaptionTextArea').length === 0 )
于 2012-09-03T01:43:27.203 に答える