click()与dispatchEvent触发click事件的差异及失效原因咨询
这两者的核心差异主要有三点:
事件的"可信度"不同
button.click()是浏览器原生提供的方法,它触发的是可信事件(Trusted Event),这类事件的isTrusted属性为true,浏览器和网页的交互逻辑会将其判定为用户真实操作。而你用new Event('click')创建的是"非可信事件",isTrusted属性固定为false,现在很多网站的防爬校验、表单逻辑会特意检查这个属性,直接过滤非可信事件,所以你的代码无效。触发的事件流程不同
用户真实点击按钮的完整流程是mousedown → mouseup → click,button.click()会完整模拟这个顺序,先触发前两个鼠标事件,再触发click。但你直接dispatchclick事件,只会单独触发这一个事件,跳过了前面的关键步骤。如果按钮的交互逻辑绑定在mousedown或mouseup上,自然就不会有反应。事件属性的完整性不同
浏览器生成的可信事件会自动填充大量真实操作相关的属性,比如clientX、clientY、target等,无需手动设置。而你自定义的Event,哪怕手动设置了screenX/Y,其他关键属性仍为缺省值,且核心的isTrusted永远是false,这才是导致无效的最关键原因。
如果想模拟更接近真实的点击,可以尝试用MouseEvent替代普通Event(比如new MouseEvent('click', { bubbles: true, cancelable: true, clientX: rect.x, clientY: rect.y })),但要注意,这种方式生成的事件isTrusted依然是false,只有浏览器原生的click()方法能生成可信事件。
内容的提问来源于stack exchange,提问作者Jeanluca Scaljeri

