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());
        });
}

有没有办法按顺序链接这些事件,即
只有在第一个元素的触发动作完成时才应该触发第二个元素的事件。我尝试搜索 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 回答