16

追加のクリック ハンドラー (クライアント ページ、彼の js/html を変更できない) を作成したいのですが、スクリプトでは次のように動作するはずです。

1) event.stopPropagation(クライアントのクリック伝播を一時停止する)
2) 自分の機能 (自分の機能を実行し、すべてが完了したら次の操作を行う)
3) event.startPropagation(標準のクライアント アクションを続行する)

現在、一作目と二作目。3番目が問題です。
存在しないことはわかっevent.startPropagationていますが、そのようなものが欲しいです。ヒントはありますか?

4

3 に答える 3

11

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

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

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

編集

あなたのコメントに基づいて、私はあなたが次のようなものを探していると思います:

$.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
});

デモ: http://jsfiddle.net/BGuU3/1/

于 2013-07-17T09:26:31.143 に答える
2

そもそも伝播を止めないでください。

希望どおりに動作するかどうかをテストmy functionしてから、伝播を停止するかどうかを決定します。

于 2013-07-17T09:10:24.467 に答える
0

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

アップデート:

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

http://api.jquery.com/trigger/

于 2013-07-17T09:12:46.783 に答える