上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: cxxjackie - 

异步获取元素的脚本库 ElementGetter

  [复制链接]
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    904

    回帖

    1401

    积分

    荣誉开发者

    积分
    1401

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2025-2-18 22:34:40 | 显示全部楼层
    szzxc 发表于 2025-2-17 09:35
    所以只能用旧版的么?const elemGetter = new ElementGetter(jQery)  多了这个,2.0 在使用好像1.X好像也 ...

    用selector方法啊,展开1楼的兼容方案,里面有示例。
    回复
    订阅

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    回帖

    4

    积分

    助理工程师

    积分
    4
    发表于 6 天前 | 显示全部楼层
    非常感谢 c 大一直以来的热心分享与持续迭代!ElementGetter 作为异步获取元素的实用脚本库,帮我们解决了不少userscript开发中的痛点,真心为你的付出点赞~
    目前我在使用时遇到一个实际场景:需要匹配一些仅含特定文本、无 class 等其他定位信息的 div,因此必须用到 xpath 选择器。但 xpath 不仅性能略逊于 css 选择器,我对其语法也不够熟悉,所以实际开发中需要 css 和 xpath 并用。
    不过升级到 2.x 版本后,ElementGetter 取消了实例化功能,仅保留全局实例。这就导致混合使用两种选择器时,需要频繁调用 select 方法切换选择器类型,操作上不够便捷;更关键的是,在高并发场景下,select 方法与 get/each 方法并非原子操作,可能会出现选择器类型切换错误的问题,影响功能稳定性。
    因此想提个小建议:是否可以考虑恢复 1.x 版本中支持实例化的使用方式,允许在构造器参数中指定选择器类型?这样我们就能直接实例化两个 ElementGetter 实例,分别对应 css 和 xpath 选择器,无需频繁切换,既让代码更清晰,也能避免高并发下的潜在问题。
    再次感谢 c 大的辛勤付出,也期待 ElementGetter 能持续优化,越来越好~
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    904

    回帖

    1401

    积分

    荣誉开发者

    积分
    1401

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 6 天前 | 显示全部楼层

    kunki 发表于 2026-1-29 19:43

    非常感谢 c 大一直以来的热心分享与持续迭代!ElementGetter 作为异步获取元素的实用脚本库,帮我们解决了 ...

    选择器类型切换的问题我有处理过了,每次调用get、each都会在内部记录本次的选择器类型,理论上来说应该不会混淆,且js是单线程,通常不必过于关注原子操作的问题,如果有bug可以提供一下复现用例,我会尝试修复。
    取消实例化是为了简化调用,因为绝大多数情况都是单实例,多写句new就显得没有必要,而且这个库主要是面向新手的,我想尽可能减少出错的概率,你可以看到我在接口设计上做了很多妥协,比如parent参数可以单独省略,这在编程实践上是个有点糟糕的设计,不过只要最后写出来的代码既简洁又不容易出错,就算达到目的了。
    关于你的需求我有个更简单的提议,在你的脚本内封装这两个函数应该就足够了,这样就不需要修改库设计:

    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');
    }
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表