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可以区分两者吗?

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

在与马特的完全不同的策略上,您可以利用以下功能.triggerHandler()- 即它不会冒泡,而手动单击(和.trigger())会冒泡。

通过将点击功能分成两个处理程序,一个直接附加,另一个委托给合适的容器,您有一种机制来执行两个处理程序以响应手动单击,但只有一个响应.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);
});

演示

当然,您会很快发现这种方法有其局限性。您不仅失去了单一作用域的可能优势,而且无论附件的制作顺序如何,“直接”事件总是会首先触发。尽管您可以采取稍微混乱的措施来颠倒顺序,但处理将一个处理程序的功能嵌入另一个处理程序的需要确实会变得非常混乱。你很可能会很快恢复到马特的方法。

于 2012-05-28T12:25:23.833 回答