Tampermonkey运行MouseEvent构造代码报view转Window错误如何解决
Tampermonkey 脚本默认运行在独立沙箱环境中,脚本内调用的window是油猴沙箱封装的代理对象,而非页面原生的 Window 实例。浏览器控制台执行代码时默认处于页面原生上下文,调用的window是符合要求的原生对象,因此不会报错。构造MouseEvent时要求view属性传入的必须是页面所属的原生 Window 对象,沙箱代理对象不符合类型校验规则,就会抛出类型转换失败的错误。
方案1:省略可选的
view参数。view本身是MouseEvent初始化的可选配置项,绝大多数模拟点击的场景下不传入该参数也可以正常触发预期效果,修改后代码如下:document.querySelector('.flat.pagination.next').dispatchEvent(new MouseEvent("mousedown",{ bubbles: true, cancelable: true, clientX: 0, clientY: 0, button: 0 }));方案2:用油猴提供的
unsafeWindow代替window。unsafeWindow是 Tampermonkey 暴露的直接指向页面原生 Window 实例的引用,替换后即可符合参数要求:document.querySelector('.flat.pagination.next').dispatchEvent(new MouseEvent("mousedown",{ view: unsafeWindow, bubbles: true, cancelable: true, clientX: 0, clientY: 0, button: 0 }));方案3:将代码注入页面上下文执行。如果存在更多依赖页面原生上下文的逻辑,可以把代码插入到页面的
script标签中运行,此时执行环境和浏览器控制台完全一致:
const injectScript = document.createElement('script'); injectScript.textContent = ` document.querySelector('.flat.pagination.next').dispatchEvent(new MouseEvent("mousedown",{ view: window, bubbles: true, cancelable: true, clientX: 0, clientY: 0, button: 0 })); `; document.documentElement.appendChild(injectScript); injectScript.remove();
内容的提问来源于stack exchange,提问作者Joe

