在jQuery中,我如何区分程序和用户点击?

假设我定义了一个点击处理程序:

$("#foo").click(function(e){

});

我怎样才能在函数处理程序中判断事件是以编程方式触发还是由用户触发?

Kevin Owocki asked 2019-09-09T17:47:40Z
7个解决方案
110 votes

你可以看看事件对象originalEvent.如果事件是由真正的点击触发的,你会在e内找到clientX,clientY,pageXpageY等内容,它们将是数字; 这些数字与触发点击时的鼠标位置有关,但即使点击是通过键盘启动的,它们也可能存在。 如果事件是由$x.click()触发的,那么您将无法获得e中的常用位置值。您还可以查看originalEvent属性,如果事件来自$x.click(),则该属性不应该存在。

也许是这样的:

$("#foo").click(function(e){
    if(e.hasOwnProperty('originalEvent'))
        // Probably a real click.
    else
        // Probably a fake click.
});

这里有一个小沙箱可以玩:[http://jsfiddle.net/UtzND/]

mu is too short answered 2019-09-09T17:48:10Z
43 votes

您可以使用jQuery触发器手册中所述的额外参数:

$("#foo").click(function(e, from){
    if (from == null)
        from = 'User';
    // rest of your code
});

$('#foo').trigger('click', ['Trigger']);
Shikiryu answered 2019-09-09T17:48:36Z
9 votes

还有另一个问题已经回答了。

如何检测click()是否是鼠标单击或由某些代码触发?

使用事件对象的which属性。 对于代码触发事件,它应该是undefined

$("#someElem").click(function(e) {
    if (e.which) {
        // Actually clicked
    } else {
        // Triggered by code
    }
});

JsFiddle示例 - [http://jsfiddle.net/interdream/frw8j/]

希望能帮助到你!

Swanidhi answered 2019-09-09T17:49:22Z
4 votes

DOM Level 3指定event.isTrusted。 这只是IE9 +和Firefox目前支持的(基于我的测试。我也读过(尽管没有经过深入研究)它可以在某些浏览器中被覆盖,并且可能还没有100%准备好实际被信任(不幸的是)。

这是@ mu的小提琴的修改版本,适用于IE和Firefox。

Joe Enzminger answered 2019-09-09T17:49:55Z
1 votes

我已经尝试了所有上述解决方案。在我的案例中没有任何工作。 以下解决方案适合我。 希望它也会对你有所帮助。

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>

<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>

<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>

GSB answered 2019-09-09T17:50:29Z
0 votes

Vanilla js解决方案:

document.querySelector('button').addEventListener('click', function (e){
    if(e.isTrusted){
        // real click.
    }else{
        // programmatic click
    }
});
Abhishek answered 2019-09-09T17:50:55Z
-1 votes

不会参加智力讨论,对我来说过滤.click().trigger('click')的代码是 -

$(document).on('click touchstart', '#my_target', function(e) {
    if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click')
        //Then code goes here
    }
});
Vishal Kumar Sahu answered 2019-09-09T17:51:22Z
translate from https://stackoverflow.com:/questions/6674669/in-jquery-how-can-i-tell-between-a-programmatic-and-user-click