2012-04-05 2 views
0

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

しかし、私は.click()関数内.live()または.bind()機能を追加した場合、live()機能が何らかの理由でトリガーされます。

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

#myDivを示したが、すぐに非表示になり、長引く.showingクラスによって証明されます。

私はlive()を使用していますか?この再帰を避けるにはどうしたらいいですか?

+0

はあなたが現在何をしているかを説明するのではなく、やろうとしているかを説明します。おそらく、バグの可能性があるコードを修正するのではなく、代わりの方法を提供することができます。 – Joseph

答えて

3

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

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

ありがとう、これも働いて、イベントを渡してevent.stopPropagation()を使用するより簡単です。 – podcastfan88

+0

いつも歓迎:-) –

+2

@stuart - FYI、 'false'を返すのはまったく同じ' e.stopPropagation() 'ではありません。 falseを返すと、jQueryは 'e.stopPropagation()'と 'e.preventDefault()'の両方を実行します。この場合、あなたと違うことはないかもしれませんが、まったく同じではないことを理解する必要があります。イベントハンドラに渡される限り、引数を宣言してもいなくても、常にイベントハンドラに渡されます。常にそれが存在します。 – jfriend00

0

利用ライブせずに結合第2の本体クリック(も、あなたがそれ常にページであるため、それを必要としない)、タイムアウトを使用します。

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

}); 
+0

私のテストによれば、これは依然として自分自身を引き起こします:http://jsfiddle.net/GsP5j/1/。 '$( 'body')'が常にクリックイベントを受け入れることを望まないので、私は 'live()'を使っていました。 – podcastfan88

+0

タイムアウトを使用してバリアントを再確認してください – Rustam

+0

これはオプションのおかげでうまくいきました。 – podcastfan88

0

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

0

現在のイベントの伝播を停止して、新しいイベントハンドラが表示するボディにバブリングしないようにする必要があります。さらに、1つのタイムイベントハンドラの.one()を使用することができます。

$('#myDiv').on('click',function(e){ 
    $('#myDiv .child').show().addClass('showing'); 
    e.stopPropagation(); 
    $(document.body).one('click', function() { 
      $('#myDiv .child').hide(); 
    }); 
}) 
+0

ありがとう、これは働いた!私は伝播について聞いたことがあるが、これまで心配する必要はなかった。 – podcastfan88

関連する問題