0

$('body').live('click')ユーザーが div をクリックした後にリスナーを追加しようとしています。目的は、ユーザーがページ上の任意の場所をクリックして開いて最終的に閉じることができるカスタム ドロップダウン ボックスを作成することです。

しかし、関数内で追加.live()または関数を実行すると、何らかの理由で関数がトリガーされます。.bind().click()live()

$('#myDiv').click(function(){
    $('#myDiv .child').show().addClass('showing');
    $('body').live('click', function(){
           $('#myDiv .child').hide();
           $('body').die();
    })
})

#myDiv.showing表示されますが、クラスが残っていることからも明らかなように、すぐに非表示になります。

私はlive()間違って使用していますか?この再帰を回避するにはどうすればよいですか?

4

4 に答える 4

3

return falseイベントの伝播を停止します:

    $('#myDiv').click(function(){
    $('#myDiv .child').show().addClass('showing');
    $('body').live('click', function(){
           $('#myDiv .child').hide();
           $('body').die();
    });
    return false;
})
于 2012-04-05T02:54:19.793 に答える
0

多分それはうまくいくはずです、多分それはうまくいかないはずです。しかし、そうではありません。最初にすべてのイベントハンドラーを設定し、2番目のイベントハンドラーが実際に応答するかどうかを追跡するグローバル変数(例)を設定することをお勧めします。

于 2012-04-05T02:50:49.623 に答える
0

おそらく、現在のイベントの伝播を停止して、新しいイベントハンドラーがイベントを表示する本体にイベントがバブリングしないようにする必要があります。.one()さらに、 1回限りのイベントハンドラーに使用できます。

$('#myDiv').on('click',function(e){
    $('#myDiv .child').show().addClass('showing');
    e.stopPropagation();
    $(document.body).one('click', function() {
           $('#myDiv .child').hide();
    });
})
于 2012-04-05T02:51:24.497 に答える
0

ライブなしで2番目のボディクリックバインディングを使用し(常にページ上にあるため、必要ありません)、タイムアウトを使用します。

$('#myDiv').on('click',function(){
    $('#myDiv .child').show().addClass('showing');
setTimeout(function(){
$('body').on('click', function(){
           $('#myDiv .child').hide();
           $('body').off('click');
    });
},0);

});
于 2012-04-05T02:44:35.517 に答える