type
status
date
summary
tags
category
icon
最近基于Tauri封装了一个微信读书的客户端 weread-client,扩展了些快捷键,方便阅读。支持 n / p切换到上/下章节,搞的过程中碰到一个很有意思的事情,模拟click事件竟然不生效。
一开始以为很简单,js模拟点击事件,通过MDN的文档,可以有下面的解法:
这个方案在大多数页面是可行,但对于微信读书的页面,却是不行。
一开始不明所以,想debug一下源码,无奈js被压缩和混淆了,还有各种防止debug的手段,就放弃了。但我发现我使用的 vimium-c 的chrome插件是可以可以通过键盘的快捷键触发。
于是解决方案变成debug一下vimium-c源码是如何模拟事件的。经过一番努力,终于解决了了这个问题,解法如下:
vimium-c 这个插件是通过PointerEvent模拟事件。对于键盘事件而言,PointerEvent和MouseEvent是一样的,如上代码pointerType也是指定为 mouse,所以和MouseEvent是无区别的。
后面偶然看到其源码重存在一段判断逻辑如下:
主要原因是对 clientX 和 clientY 属性的判断,可能是为了避免 JS 模拟构造事件?这个就无从得知了。
因此可以简化一下,只需要简单设置一下 clientX 和 clientY 属性即可:
当然如果我们直接在控制台执行上述代码会出现一个异常。一个可解决的方案是使用 Tampermonkey 注入 js 文件可行。此次的猜测是做了js来源的判断,如果是控制台,对应 js 的文件路径会默认为undefined ,从而导致 js 异常,而插件注入的 js,路径可能会被过滤,但不确定。
总结一下
模拟事件点击通过 MouseEvent 构建一个事件即可,如果不可行,可能是代码中针对事件有一些特殊的逻辑判断,例如微信读书网页中针对事件,判断其是否有 clientX 和 clientY 属性