2013-07-17 3 views
13

は、私は(彼のJS/HTMLを修正するカント、クライアントページ)追加のクリックハンドラを作りたい、それが私のスクリプトでは、次のように動作するはずです:のstopPropagationとstartPropagation

1)event.stopPropagation(一時停止クライアントのクリック伝播)
2)私の機能(すべてが終わったら、私の機能を行う)
3)event.startPropagation(標準クライアントアクションを続ける)

今、最初と2番目の仕事。 3番目は問題です。
私はevent.startPropagationが存在しないことを知っていますが、そのようなものが欲しいです。 ヒント?

答えて

4

最初に伝播を停止しないでください。

my functionの場合はテストし、伝播を停止するかどうかを決定します。

+1

、私の関数は(DBにGET)を実行する時間がない持っています。私はその開始のstopPropagationに必要だと思う –

+0

可能性のあるユーザーエクスペリエンスを考慮する必要があります:ユーザーが何かをクリックし、データベース呼び出しが完了するまで何も起こりません。最悪の場合、それは応答が遅く見える長い時間かもしれません。 – ehdv

+0

これは悪い答えです。なぜなら、同じ要素に複数のイベントがバブリングされている場合、伝播の停止が必要な場合が多いからです。メソッドが存在するのはそれが全理由です。 – kjdion84

0

clickイベントをそれぞれ有効または無効にする場合は、クリックハンドラを追加および削除します。 event.stopPropagation()はイベントがdomツリーを伝播するのを止めるためです。

更新:

あなたはjQueryのを使用している場合は、.trigger()関数を使用します。

​​

9

あなたは再トリガすることができ、同じイベントオブジェクトを親ノード、f.ex(jQueryの)に。あなたは、最初のイベントオブジェクトをコピーして、バブル(f.ex e.pageX)で同じイベントのプロパティをキャプチャするためにトリガにそれを渡す必要があります:

var copy = $.extend(true, {}, e); 
setTimeout(function() { 
    $(copy.target.parentNode).trigger(copy); 
},500); 
e.stopPropagation(); 

デモ:http://jsfiddle.net/GKkth/

EDIT

あなたのコメントに基づいて、私はあなたのような何かを探していると思う:

$.fn.bindFirst = function(type, handler) { 
    return this.each(function() { 
     var elm = this; 
     var evs = $._data(this).events; 
     if (type in evs) { 
      var handlers = evs[type].map(function(ev) { 
       return ev.handler; 
      }); 
      $(elm).unbind(type).on(type, function(e) { 
       handler.call(elm, e, function() { 
        handlers.forEach(function(fn) { 
         fn.call(elm); 
        }); 
       }); 
      }); 
     } 
    }); 
}; 

このプロトタイプを使用すると、以前のすべてのハンドラを実行するnext関数を保持する「プレミアムハンドラ」を、同じ要素にバインドできます。 のようにそれを使用します。

$('button').click(function() { 
    console.log('first'); 
}).click(function() { 
    console.log('second'); 
}).bindFirst('click', function(e, next) { 
    console.log('do something first'); 
    setTimeout(next, 1000); // holds the other handlers for 1sec 
}); 

はDEMO:私は固定する]をクリックするとhttp://jsfiddle.net/BGuU3/1/

+0

さて、私はこれを多くの方法で試してみましたが、良い結果はありませんでした。たぶん私は何か悪いことをするでしょう。 例: //クライアント側のクリックハンドラ $( 'p')。クリック(機能(e){ document.location = 'http://www.onet.pl'; }); 。 //私のスクリプト $( 'P')をクリックします(関数(E){ e.stopPropagation(); e.preventDefault(); $ に.get( ....、 ... 。、 function(){ //あれば、startPropagationのようなことをしてください } ) }); –

+2

@PiotrWójcikは、ハンドラが同じ要素(http://api.jquery.com/event.stopImmediatePropagation/)にアタッチされているので、stopImmediatePropagation()を探しているようです。これまで実行されていなかったハンドラを停止しないことを忘れないでください。または、すでにバインドされているハンドラを見つけて保存し、後で独自のトリガで実行するだけでもかまいません。 – David

+2

@PiotrWójcik私は可能な解決策で私の答えを編集しました、それはあなたが必要とするものですか? – David

関連する問題