javascript - 如何使一个不能模拟点击
问题描述
我在为某人编写脚本时注意到这个特殊按钮(登录按钮):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;
如何实现这种功能?
解决方案
这是他们可能正在做的事情的一个例子。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>
推荐阅读
- angular - Angular Reactive Form,valueChanges 运行到“最大调用堆栈大小”
- javascript - 安装 Angular 的问题
- ios - CoreData+CloudKit | 开/关 iCloud 同步切换
- floating-point - ULP 中的浮点错误(最后一位的单位)
- azure - 如何在 Azure 数据工厂的数据流中获取数据库连接状态?
- google-cloud-firestore - Firestore 存储规则聊天
- homebrew - GitHub Actions:自制程序慢
- php - 可见性修改器
- hyperledger-fabric - Hyperledger Fabric Metric 用于与各个对等方进行对等通信
- google-apps-script - Copy Spreadsheet to a new file, specify tabs