3

だから私はコードを持っています:

function randomClick(interval){
        $(".thumbnail_holder .nav li:not(.empty):eq("+select+") a").trigger("click");
        window.randomTimer = setTimeout("randomClick("+interval+")", interval);
}

ユーザーがクリック".thumbnail_holder .nav li aすると間隔がクリアされるので、たとえば

$(".thumbnail_holder .nav li a").on("click", function(e){
    e.preventDefault();
    clearTimeout(window.randomTimer);
});

ただし、上記のコードは。でも発生します.trigger("click");

.on関数が2つを区別できる方法はありますか?

4

2 に答える 2

5

e.whichイベントがによって呼び出されたときは未定義になりtrigger()ますが1、左クリックしたときに定義されます。

$(".thumbnail_holder .nav li a").on("click", function(e){
    e.preventDefault();

    if (typeof e.which !== "undefined") {
        clearTimeout(window.randomTimer);
    }
});

他のオプションは、手動でトリガーするときにいくつかのデータを渡し、イベントハンドラーでそれをチェックすることです(のextraParameters引数を参照してくださいtrigger()

function randomClick(interval){
    $(".thumbnail_holder .nav li:not(.empty):eq("+select+") a").trigger("click", [true]);
    window.randomTimer = setTimeout("randomClick("+interval+")", interval);
}

$(".thumbnail_holder .nav li a").on("click", function(e, wasTrigger){
    e.preventDefault();

    if (!wasTrigger) {
        clearTimeout(window.randomTimer);
    }
});
于 2012-05-28T10:39:35.357 に答える
2

Mattとはまったく異なる方法で、次の機能を利用できる場合があり.triggerHandler()ます。つまり、手動でクリック(および.trigger())がバブルするのに対し、バブルは発生しません。

クリック機能を2つのハンドラーに分割します。1つは直接接続され、もう1つは適切なコンテナーに委任されます。手動クリックに応答して両方のハンドラーを実行し、に応答して1つだけを実行するメカニズムがあります.triggerHandler()

$(document).on('click', 'a', function(e) {
    e.preventDefault();
    $msg2.text('Bubbled').show().fadeOut(1000);
});

$("#myLink").on('click', function(e) {
    e.preventDefault();
    $msg1.text('Direct').show().fadeOut(1000);
});

デモを見る

もちろん、このアプローチには限界があることにすぐに気付くでしょう。単一のスコープの潜在的な利点が失われるだけでなく、アタッチメントが作成された順序に関係なく、「Direct」イベントが常に最初に発生します。順序を逆にするために少し厄介な対策を講じることができますが、一方のハンドラーの機能をもう一方のハンドラー内に埋め込む必要性を処理することは、実際には非常に厄介になります。おそらく、マットのアプローチにすぐに戻るでしょう。

于 2012-05-28T12:25:23.833 に答える