首页 > 解决方案 > 如何使一个不能模拟点击

问题描述

我在为某人编写脚本时注意到这个特殊按钮(登录按钮):https ://www.easports.com/fifa/ultimate-team/web-app/不允许模拟点击它以任何可能的方式。

我非常想知道他们是如何做到的。我试过了

var btn=$('#Login > div > div > button.btn-standard.call-to-action');
btn.click(); // or trigger('click');

// or
click = new Event(click);
btn.dispatchEvent(click);

// or

btn.trigger('mousedown');

// oh and also:

function click(x, y)
{
 var ev = new MouseEvent('click', {
     'view': window,
     'bubbles': true,
     'cancelable': true,
     'screenX': x,
     'screenY': y
 });

 var el = document.elementFromPoint(x, y);

 el.dispatchEvent(ev);
}

我什至尝试过 mouseenter,然后是 mousedown 和 mouseup;

如何实现这种功能?

标签: javascriptjquery

解决方案


这是他们可能正在做的事情的一个例子。Event.isTrusted为您提供有关它是用户操作还是创建事件的信息。他们可能对此有一些逻辑:

文档

Event 接口的 isTrusted 只读属性是一个布尔值,当事件由用户操作生成时为 true,当事件由脚本创建或修改或通过 EventTarget.dispatchEvent() 调度时为 false。

document.getElementById('btn').addEventListener('click', (e) => console.log(e.isTrusted));

// Simulate a click onload (should print false to the console)
document.getElementById('btn').click(); // false

// TODO: Click the Button manually, you should see 'true' being printed
<button id="btn">Button</button>

我的猜测是,如果你查看他们的源代码,你会看到他们只是在做类似的事情,.stopPropogation或者.preventDefault如果isTrusted是假的。

所以他们可能正在这样做:

document.getElementById('btn1').addEventListener('click', (e) => {
  if (!e.isTrusted) { e.preventDefault(); return;}
  console.log('Button clicked!');

});

document.getElementById('btn1').click(); // nothing printed to console.
<button id="btn1">Button</button>


推荐阅读