szzxc 发表于 2025-2-17 09:35
所以只能用旧版的么?const elemGetter = new ElementGetter(jQery)多了这个,2.0 在使用好像1.X好像也 ...
用selector方法啊,展开1楼的兼容方案,里面有示例。
非常感谢 c 大一直以来的热心分享与持续迭代!ElementGetter 作为异步获取元素的实用脚本库,帮我们解决了不少userscript开发中的痛点,真心为你的付出点赞~
目前我在使用时遇到一个实际场景:需要匹配一些仅含特定文本、无 class 等其他定位信息的 div,因此必须用到 xpath 选择器。但 xpath 不仅性能略逊于 css 选择器,我对其语法也不够熟悉,所以实际开发中需要 css 和 xpath 并用。
不过升级到 2.x 版本后,ElementGetter 取消了实例化功能,仅保留全局实例。这就导致混合使用两种选择器时,需要频繁调用 select 方法切换选择器类型,操作上不够便捷;更关键的是,在高并发场景下,select 方法与 get/each 方法并非原子操作,可能会出现选择器类型切换错误的问题,影响功能稳定性。
因此想提个小建议:是否可以考虑恢复 1.x 版本中支持实例化的使用方式,允许在构造器参数中指定选择器类型?这样我们就能直接实例化两个 ElementGetter 实例,分别对应 css 和 xpath 选择器,无需频繁切换,既让代码更清晰,也能避免高并发下的潜在问题。
再次感谢 c 大的辛勤付出,也期待 ElementGetter 能持续优化,越来越好~
kunki 发表于 2026-1-29 19:43
非常感谢 c 大一直以来的热心分享与持续迭代!ElementGetter 作为异步获取元素的实用脚本库,帮我们解决了 ...
选择器类型切换的问题我有处理过了,每次调用get、each都会在内部记录本次的选择器类型,理论上来说应该不会混淆,且js是单线程,通常不必过于关注原子操作的问题,如果有bug可以提供一下复现用例,我会尝试修复。
取消实例化是为了简化调用,因为绝大多数情况都是单实例,多写句new就显得没有必要,而且这个库主要是面向新手的,我想尽可能减少出错的概率,你可以看到我在接口设计上做了很多妥协,比如parent参数可以单独省略,这在编程实践上是个有点糟糕的设计,不过只要最后写出来的代码既简洁又不容易出错,就算达到目的了。
关于你的需求我有个更简单的提议,在你的脚本内封装这两个函数应该就足够了,这样就不需要修改库设计:
```js
function getElementByXpath(...args) {
elmGetter.selector('XPath');
const result = elmGetter.get(...args);
elmGetter.selector('CSS');
return result;
}
function eachElementByXpath(...args) {
elmGetter.selector('XPath');
elmGetter.each(...args);
elmGetter.selector('CSS');
}
```