检测按钮是否单击真实用户或由脚本触发

use*_*402 13 javascript events onclick

是否有任何方法可以让我检测按钮单击是否由真实用户执行而不是用户已加载到浏览器开发人员控制台或其他浏览器开发人员工具上的某些自动方法(javascript)?

我尝试了各种stackoverflow帖子中建议的以下方法,但它们似乎都不起作用.REF:如何检测click()是否是鼠标单击或由某些代码触发?

脚本检测方法尝试失败:

mybutton.click(function (e) {
    if (!e.which) {
        //Triggered by code NOT Actually clicked
        alert(' e.which - not a real button click')
    } else if ('isTrusted' in e && !e.isTrsuted) {
        //Triggered by code NOT Actually clicked
        alert(' e.isTrusted - not a real button click')
    } else if (e.originalEvent === undefined) {
        //Triggered by code NOT Actually clicked
        alert(' e.originalEvent - not a realbutton click')
    }
    //                  else if (!e.focus) {
    //                      //triggered  // does not detect e.focus on a real btn click
    //                      alert(' e.focus - not a realbutton click')
    //                  }
    else {
        // Button hopefully clicked by a real user and not a script
    }
})
Run Code Online (Sandbox Code Playgroud)

如果我运行以下脚本来触发Chrome浏览器控制台中的按钮单击,则上述任何方法都不会将其捕获为脚本触发.

var button = document.getElementById("btnSubmit");
button.click();
Run Code Online (Sandbox Code Playgroud)

================================================== ========================

感谢您的所有回复,并感谢stackoverflow提供了这样一个伟大的网站,促进了如此多的知识共享,并为我们的技术人员节省了无数的时间.

看来我还没有可靠的方法.所有3种浏览器(FF,IE和Chrome)都为用户提供了开发人员/控制台界面,以便在我的网页上运行/注入javascript.看起来每个浏览器风格都会略微捕获一些事件属性值.例如:Chrome使用e.screenX捕获脚本激活的cick和真实用户之间的差异,但在IE中:e.screenX对于脚本单击(合成)和用户按钮单击具有相同的值

以下检测方法要么根本不起作用,要么在不同的浏览器中不一致:e.which e.isTrsuted e.originalEvent(event.source!= window)(e.distance!= null)

mousedown事件似乎仅由真实用户按钮点击触发,但我必须假设除了按钮单击事件之外还有一些脚本方法来模拟mousedown

$(me.container + ' .mybutton').mousedown(function (e) { 
    alert('mouseisdown real button click'); 
}
Run Code Online (Sandbox Code Playgroud)

如果有人能够找到一种适用于多个浏览器的可靠方法,它可以检测合成(脚本)按钮单击和用户单击按钮之间的区别,那么您将获得超级英雄状态.

小智 11

当通过鼠标点击按钮时,事件e通常会记录鼠标指针位置.尝试类似的东西:

   if(e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0){
     alert("real button click");
   }
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ler 5

出于安全目的,当您使用 javascript 触发事件时,它将与用户触发事件的注册方式不同。控制台记录ev对象,您将看到两种情况之间的显着差异。

mybutton.click(function(ev) {
  console.log(ev);
});
Run Code Online (Sandbox Code Playgroud)

以下是两种情况的一些示例输出:

jQuery.Event
currentTarget: button
data: null
delegateTarget: button
handleObj: Object
isTrigger: true
jQuery191011352501437067986: true
namespace: ""
namespace_re: null
result: undefined
target: button
timeStamp: 1360472753601
type: "mousedown"
__proto__: Object

jQuery.Event {originalEvent: MouseEvent, type: "mousedown", isDefaultPrevented:     function, timeStamp: 1360472840714, jQuery191011352501437067986: true…}
altKey: false
bubbles: true
button: 0
buttons: undefined
cancelable: true
clientX: 39
clientY: 13
ctrlKey: false
currentTarget: button
data: null
delegateTarget: button
eventPhase: 2
fromElement: null
handleObj: Object
isDefaultPrevented: function returnFalse() {
jQuery191011352501437067986: true
metaKey: false
offsetX: 37
offsetY: 11
originalEvent: MouseEvent
pageX: 39
pageY: 13
relatedTarget: null
screenX: 1354
screenY: 286
shiftKey: false
target: button
timeStamp: 1360472840714
toElement: button
type: "mousedown"
view: Window
which: 1
__proto__: Object
Run Code Online (Sandbox Code Playgroud)


Dag*_*bit 5

不,在所有情况下都不可能.

正如其他提到的答案,您可以查找鼠标坐标(clientX/Y和screenX/Y),如果它们不存在,您可以假设它可能不是人为生成的动作.

但是,如果用户选中按钮并使用空格键单击它,或者不使用鼠标单击它,则坐标也将为零,并且此方法将错误地将其确定为脚本化单击.

此外,如果脚本使用dispatchEvent而不是click,则可以为事件指定坐标.在这种情况下,此方法将错误地将其识别为用户生成的单击.

// This will produce what appears to be a user-generated click.
function simulateClick(element) {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 110, 111, 10, 11, false, false, false, false, 0, null);
  element.dispatchEvent(evt);
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/bYq7m/