2009-03-16 21 views
43

2つの異なる時間にクリックイベントにバインドされた2つの関数があります(jQueryを使用)。彼らが解雇される順序は重要です。彼らは正しい順序で発砲しています。問題は、最初の関数がfalseを返すとき、2番目の関数がまだ発火しているということです。jQuery複数イベントハンドラ - キャンセル方法

イベントを正しくキャンセルするにはどうすればよいですか?

例コード:

$(document).click(function() { 
    alert('a'); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 

ページをクリックするとあなたはまだ "B" の警告メッセージが表示されます。これは受け入れがたい!

答えて

82

jQueryのイベントオブジェクトのstopImmediatePropagation機能を使用してください。

残りのハンドラが実行されないようにします。 このメソッドは、event.stopPropagation()を呼び出してバブリングを停止します。

$(document).click(function(event) { 
    alert('a'); 
    event.stopImmediatePropagation(); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 
+1

これが機能するには、jQueryバージョン1.3以上を使用する必要があることに注意してください。 –

+0

about $(document).on( "touchstart click"、 ".myelement"、function(e){e.stopImmediatePropagtion(); //ここで関数を実行})...タブレットデバイスでタッチスタートが最初に発生した場合指を押し続けると、発射からのクリックがキャンセルされますか? – Alex

1

アンバインドヘルプを使用していますか?

$(document).click(function() { 
    alert('a'); 
    $(this).unbind('click'); 
    return false; 
}); 
+3

最初の関数がfalseを返さないときには、まだ2番目のイベントが発生する必要があります。文字通り「アンバインド」を解除しませんか? –

+0

ええ。それはおそらく全体的に素晴らしいソリューションではないでしょう... – nickf

+0

私の解決策をニックのソリューションとマージすることができます。あなたの行動を得るでしょう:) – fmsf

0

nickfは動作しません、あなたは小さなステート・マシンを使用することができると言いましたどのような場合:

var trigger = 0; 

$(document).click(function() { 

    alert('a'); 
    if(you_want_to_return_false) { 
    trigger = 1; 
    return false; 
    } 
}); 

$(document).click(function() { 
    if(trigger !== 0) { 
    alert('b'); 
    } 
    trigger = 0; 
}); 

ないきれいなソリューションを、それが動作します。

+0

まあ、私の考え*作品*それは同時にそれを壊すだけです。しかし、このアイデアのために+1。 – nickf

+0

このメソッドは、より多くのコードを除いて、他のメソッドとまったく同じ方法でブレークします。私が間違っているなら、私を訂正してください。 –

+0

申し訳ありません再送信します – fmsf

2

私が最初に尋ねるのは、なぜ2つの機能が同じクリックイベントにバインドされていますか?コードにアクセスすると、ただ1回だけ電話をかけてみませんか?

$(function(){ 
    var callbackOne = function(e){ 
     alert("I'm the first callback... Warning, I might return false!"); 
     return false; 
    }; 

    var callbackTwo = function(e){ 
     alert("I'm the second callback"); 
    }; 

    $(document).click(function (e){ 
     if(callbackOne(e)){ 
      callbackTwo(e); 
     } 
    }); 
}); 
+4

組織。このアプリには1トンのJavascriptコードがあり、それは複数のファイルに分割されています。この方法では、各ページは必要なものだけをダウンロードし、ロード時間が急激になります。私はそれらを結合し、圧縮し、キャッシュするHTTPハンドラも持っているので、それらはすべてひとつのリクエストで取得されます。 –

+0

それで-1が本当に必要ですか?ちょうど助けようとしています...あなたの説明は、あなたのための解決*ではないことを皆に知らせるのに十分です。 – Seb

+1

私は-1しなかった、おい! –

2

おかげで、関数を再定義するためのアンバインド作品。

$(document).ready(function(){ 
     $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
    }); 
$(".tipo").live('click',function(){ 
      if($(this).attr('checked')!=''){ 
       if($(this).val()=='libro'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); }); 
       }else if($(this).val()=='otra'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500'); }); 
       } 
      } 
     }) 
関連する問題