6

私はjqueryの初心者です。10個の「a」タグのリストがあり、すべてイベントハンドラmouseover、click、mouseoutにそれぞれ関連付けられているとします。
私がやりたいことは、すべての「a」要素を反復処理し、jquery トリガーを使用してこれらのイベントをトリガーすることです。
私が直面している問題は、これらのイベントがトリガーされるまでに時間がかかるため、コードを実行すると、最後の要素でのみ結果が変化することがわかります。そして、中間体ではありません。

$.each($("#styles a"), function(){
    console.log("picked up " + $(this));
    setTimeout(qwe($(this)), 2000);
});

function qwe(obj) {
    console.log(obj.attr("id"));
    $.when(obj.trigger("mouseover").trigger("click").trigger("mouseout"))
        .then(function () {
            console.log("Changing Result Value" + $("#textTag").text());
        });
}

これらのイベントを順番にチェーンする方法はありますか。つまり、
2 番目の要素のイベントは、最初の要素のトリガー アクションが完了したときにのみトリガーする必要があります。私はSOを検索してみましたが、ほとんどの記事は単一のイベントのみをトリガーすることを中心に展開しています. ありがとう

4

1 に答える 1

0

チェーンの各部分に $.Deferred オブジェクトを作成し、それらをバインドして、イベントが実際にトリガーされたときに解決されるようにします。

callbacks = [$.Deferred(), $.Deferred(), $.Deferred()];
obj.on('mouseover', callbacks[0].resolve);
obj.on('click', callbacks[1].resolve);
obj.on('mouseout', callbacks[2].resolve);
$.when(callbacks).done(function() { console.log('all three have fired'); });

マウスアウトの前にクリックがトリガーされない場合は、おそらく「拒否」を使用して、順序が確実に保持されるようにする追加のロジックが必要です。

于 2013-07-05T16:37:20.387 に答える