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

Kev*_*cki 89 jquery

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

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

});
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 113

您可以查看事件对象e.如果该事件是由一个真实的点击触发的,你必须之类的东西clientX,clientY,pageX,pageY,等内e,他们将是数字; 这些数字与触发点击时的鼠标位置有关,但即使点击是通过键盘启动的,它们也可能存在.如果事件被触发,$x.click()那么你将没有通常的位置值e.您还可以查看该originalEvent属性,如果事件来自该属性,则不应该存在$x.click().

也许是这样的:

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

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

  • 那太棒了......我只是想到自己"也许jQuery触发的事件没有鼠标位置信息"!w00t! (3认同)
  • 我担心生成点击事件的第三方脚本和我的脚本在假设它是用户生成(实际点击)的情况下处理它. (3认同)
  • 这可以在支持createEvent的浏览器中失败.http://jsfiddle.net/UtzND/26 (2认同)
  • @JoeEnzminger是的,但是为什么您会打败自己的脚本……? (2认同)
  • @JoeEnzminger:一旦你的代码在浏览器中,所有的赌注都会被取消,没有什么是你能做的,不能被聪明的人打败.我认为你能做的最好的事情就是检查一堆东西:是否有一个`originalEvent`?这是正确的事情吗?有坐标吗?坐标是否一致?是`#foo`里面的坐标?... (2认同)

Shi*_*ryu 43

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

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

$('#foo').trigger('click', ['Trigger']);
Run Code Online (Sandbox Code Playgroud)

  • 我看到的唯一问题是你无法区分正常点击和`$ x.click()`,`.click()`调用者必须明确地告诉你他们正在伪造它.根据Kevin Owocki所做的事情,这可能是也可能不是问题. (3认同)

Swa*_*dhi 9

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

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

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

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

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

希望能帮助到你!

  • 并不总是有效.例如,`select`会给出一个`e.which == undefined`,即使是真正的事件. (2认同)

GSB*_*GSB 5

我已经尝试了上述所有解决方案。在我的情况下没有任何效果。以下解决方案对我有用。希望它也能帮助你。

$(document).ready(function(){
  //calling click event programmatically
    $("#chk1").trigger("click");
});

$(document).on('click','input[type=checkbox]',function(e) {
		if(e.originalEvent.isTrusted==true){
			alert("human click");
		}
		else{
			alert("programmatically click");
		}
    
    });
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)