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

异步获取元素的脚本库 ElementGetter

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

    [LV.1]初来乍到

    22

    主题

    891

    回帖

    1388

    积分

    荣誉开发者

    积分
    1388

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

    发表于 2024-11-27 22:34:43 | 显示全部楼层
    pawjazz 发表于 2024-11-27 13:55
    一直再用大佬这个库, 基本上都跑得很6, 今天报告一个性能问题
    最近遇到一个下拉菜单(框架是Vue) 有一千多项 ...

    看起来不太好优化,attributes是属性监听,目的是在节点发生属性变化时触发检查,以确保属性选择器和类选择器可以正确生效,例子的话参考本贴45楼。你这种情况应该是页面在短期内发生了很多次属性变化引起的,硬要优化的话只能人为加延迟(代码参考本贴44楼),但又会影响正常情况下的实时性,老实说我也不知道要如何取舍比较合适。
    回复
    订阅

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    891

    回帖

    1388

    积分

    荣誉开发者

    积分
    1388

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

    发表于 2024-11-30 22:15:28 | 显示全部楼层
    pawjazz 发表于 2024-11-27 13:55
    一直再用大佬这个库, 基本上都跑得很6, 今天报告一个性能问题
    最近遇到一个下拉菜单(框架是Vue) 有一千多项 ...

    已更新2.0.1尝试对这个问题进行优化,仅针对css和jquery选择器,请测试下问题有没有改善。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    回帖

    6

    积分

    助理工程师

    积分
    6
    发表于 2024-12-14 10:17:37 | 显示全部楼层
    cxxjackie 发表于 2024-11-30 22:15
    已更新2.0.1尝试对这个问题进行优化,仅针对css和jquery选择器,请测试下问题有没有改善。 ...

    测试下来, 只能用丝滑来形容!
    感谢大佬!!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    9

    主题

    91

    回帖

    96

    积分

    初级工程师

    积分
    96
    发表于 2025-2-7 16:06:06 | 显示全部楼层
    同源iframe:指定父节点为iframe.contentDocument即可。
    shadow DOM:指定父节点为shadowRoot即可。若使用XPath选择器,则父节点不能为shadowRoot,但可以shadowRoot内的元素为目标,参考以下示例:

    const shadowRoot = document.querySelector('#shadow_dom').shadowRoot;
    const div = shadowRoot.querySelector('div');
    elmGetter.selector('xpath');
    elmGetter.each('.//*', div, el => {
        console.log(el);
    });
    // 错误用法:
    elmGetter.get('.//*', shadowRoot); // '#document-fragment' is not a valid context node type.
    综合示例

    这个不太明白怎么用, 例如同源的iframe id = "zxcIframe", 下的某个元素,CSS选择器出来的结果: #auxixxxx_xxline0col0_id > section > pre , 要如何写才能判断这个元素的出现。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    891

    回帖

    1388

    积分

    荣誉开发者

    积分
    1388

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

    发表于 2025-2-7 23:09:50 | 显示全部楼层

    szzxc 发表于 2025-2-7 16:06

    同源iframe:指定父节点为iframe.contentDocument即可。
    shadow DOM:指定父节点为shadowRoot即可。若使用X ...

    function getIframeDocument(iframe) {
        return new Promise(resolve => {
            if (iframe.contentDocument) {
                resolve(iframe.contentDocument);
            } else {
                iframe.addEventListener('load', e => {
                    resolve(iframe.contentDocument);
                });
            }
        });
    }
    
    (async function() {
        const iframe = await elmGetter.get('#zxcIframe');
        const parent = await getIframeDocument(iframe);
        const el = await elmGetter.get('#auxixxxx_xxline0col0_id > section > pre', parent);
    })();
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    9

    主题

    91

    回帖

    96

    积分

    初级工程师

    积分
    96
    发表于 2025-2-11 11:24:54 | 显示全部楼层
    2.0 2.0.1
    if (reason === 'attr') return matches.call(parent, selector) ? [parent] : [];
    if (reason === 'attr') return matches.call(parent, selector) ? parent : null;

    部分网页会出现 Uncaught TypeError: Cannot read property 'call' of undefind   

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    891

    回帖

    1388

    积分

    荣誉开发者

    积分
    1388

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

    发表于 2025-2-12 22:23:20 | 显示全部楼层
    szzxc 发表于 2025-2-11 11:24
    2.0 2.0.1
    if (reason === 'attr') return matches.call(parent, selector) ? [parent] : [];
    if (reason ...

    看124楼回复,解决不了的话提供一下页面链接:
    https://bbs.tampermonkey.net.cn/ ... =2726&pid=74840
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    9

    主题

    91

    回帖

    96

    积分

    初级工程师

    积分
    96
    发表于 2025-2-14 09:05:19 | 显示全部楼层
    cxxjackie 发表于 2023-12-11 22:08
    根据错误信息推测是matches有问题,可能浏览器不兼容(那其他页面应该也会报错),或者该页面劫持了match ...

    修改start 还是会。但是用来旧版的ElementGetter1.21的版本 加上const elemGetter = new ElementGetter(jQery) 就不会出现call的错误。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    891

    回帖

    1388

    积分

    荣誉开发者

    积分
    1388

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

    发表于 2025-2-14 22:50:26 | 显示全部楼层
    szzxc 发表于 2025-2-14 09:05
    修改start 还是会。但是用来旧版的ElementGetter1.21的版本 加上const elemGetter = new ElementGetter(jQ ...

    jquery选择器是不会报错呀,因为jquery就没走matches逻辑,新版的用selector方法切换选择器类型。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    9

    主题

    91

    回帖

    96

    积分

    初级工程师

    积分
    96
    发表于 5 天前 | 显示全部楼层
    cxxjackie 发表于 2025-2-14 22:50
    jquery选择器是不会报错呀,因为jquery就没走matches逻辑,新版的用selector方法切换选择器类型。 ...

    所以只能用旧版的么?const elemGetter = new ElementGetter(jQery)  多了这个,2.0 在使用好像1.X好像也没太多区别吧。 一般就是each这个来找元素。。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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