0

我有一个<input>元素可以通过代码设置焦点,也可以通过鼠标单击设置焦点。

如果用户单击输入,则click事件处理程序将触发 - 一切都很好。如果元素通过其他方式(例如通过代码)接收焦点,那么我想手动触发click事件,以便处理程序也将触发。

我可以这样做:

$elem = $('input');
$elem
    .on('focus', function() { $(this).trigger('click') })
    .on('click', function() { alert('Clicked!') });

但是,这将导致click处理程序被触发两次;一次用于click事件,一次用于focus事件。

click只有当点击事件的结果没有收到焦点时,有没有办法选择性地触发处理程序?


更新

这是我的问题的一个非常简化的版本,所以我不能做一些事情,比如将两个处理程序绑定到focus事件等。我正在尝试合并两个第三方代码。

4

4 回答 4

1

.trigger()函数isTrigger在事件对象中添加一个属性,以标识该事件是由其使用触发的。虽然没有记录该属性仍然存在于 jQuery 1.8.3 中,但它似乎只在内部使用。

无论如何,您可以使用该extraParameters参数向事件对象添加自定义属性。例如,

$(this).trigger('click', {
    isTrigger: true
});

isTrigger即使它在未来的版本中消失,它也会保持兼容性。

于 2012-12-05T18:56:42.050 回答
0

在做了更多研究之后,似乎无法保证哪个事件会首先触发:clickfocus. (似乎没有规定事件顺序的标准。)

这意味着当focus事件触发时,无法确定click事件是否会在不久之后被浏览器触发。

我设法通过setTimeout()在事件触发后约 100 毫秒运行测试focus以检查click事件是否已触发来解决该问题。我正在使用的第三方代码(绑定到click事件)向 . 添加了一个额外的类<input>,因此我能够检查它。

于 2012-12-06T12:28:51.107 回答
0

您可以点击在mousedown事件之前触发的focus事件。当您单击可聚焦对象时,事件的顺序如下... mousedown, focus, mouseup, click

您可以在事件中设置一个标志,mousedown然后在事件中检查它focus以查看焦点是否来自鼠标单击。显然确保清除focus事件处理程序中的标志。每个应用程序都是不同的,但利用mousedown事件可以让您找出解决方案。

这是一个展示事件顺序的 JSFiddle... http://jsfiddle.net/ek7v7/

于 2014-01-16T14:56:38.657 回答
-1
$elem = $('input');
$elem
    .on('focus', function() { alert("Focused!") })

可以通过使用选项卡、单击它或使用 .focus() 聚焦输入来触发焦点

on('click', ...) 有什么原因吗?

于 2012-12-05T18:42:03.477 回答