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

异步获取元素的脚本库 ElementGetter

  [复制链接]
  • TA的每日心情

    2023-9-1 16:15
  • 签到天数: 71 天

    [LV.6]常住居民II

    4

    主题

    48

    回帖

    59

    积分

    初级工程师

    积分
    59
    发表于 2022-8-19 17:51:06 | 显示全部楼层
    大佬大佬~我的JS脚本今天突然失效了,然后我发现F12里报错的是// @require这行声明,过来一看果然是更新了,请问脚本猫没有那种自动更新您写的。。。(我不知道名词)这个东东的功能吗?
    回复
    订阅

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-8-19 21:12:28 | 显示全部楼层
    40252492 发表于 2022-8-19 17:51
    大佬大佬~我的JS脚本今天突然失效了,然后我发现F12里报错的是// @require这行声明,过来一看果然是更新了 ...

    有是有但最好不要这么做,外部库是别人写的代码,如果别人偷偷更新一些恶意代码,自动更新那不是会把你自己的脚本坑了吗?倒是报错很奇怪,按理来说引用旧版的库应该不会报错才对,我不知道脚本猫是什么机制,油猴是没问题的。会不会是你无意中触发了旧版的bug,而新版已经修复?
    如果确实想自动更新这个库,请用以下地址引入:
    https://scriptcat.org/lib/513/latest/ElementGetter.js
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 10:55
  • 签到天数: 61 天

    [LV.6]常住居民II

    14

    主题

    30

    回帖

    113

    积分

    中级工程师

    积分
    113
    发表于 2022-8-25 12:28:41 | 显示全部楼层

    本帖最后由 player 于 2022-8-25 12:34 编辑

    . . . . . . . . . . .

    我想获得第一个元素拿到值
    elmGetter.each("tr.weu-table-row > td.weu-table-column-center:nth-child(1) > .weu-table-cell > span", document, span1 => {

    let taskId = span1.innerText;

    });

    我想拿到第九个元素填充值
    elmGetter.each("tr.weu-table-row > td.weu-table-column-center:nth-child(10) > .weu-table-cell > span", document, span2 => {

    span2.innerText = result;

    });
    这样分别获取元素,填充值好像被覆盖了。

    试过嵌套,好像在循环上有问题,没有预期效果
    elmGetter.each(xxx,xxx,xxx=>{

    elmGetter.each(xxx,xxx,xxx=>{xxx});
    
    }

    );

    用了笨办法,效果是实现了,但总感觉哪里不对劲。
    elmGetter.each("tr.weu-table-row > td.weu-table-column-center:nth-child(10) > .weu-table-cell > span", document, span2 => {
    let taskId_Node= ((((span2.parentNode).parentNode).parentNode).firstElementChild);
    });

    在同父类,不相邻的元素,想用到each,应该怎么分别获取?

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-8-25 12:56:12 | 显示全部楼层

    我觉得你最后用的那种方案就挺好的啊,或者以父元素为选择目标:
    1. elmGetter.each('tr.weu-table-row', document, tr => {
    2.     const span1 = tr.querySelector('td.weu-table-column-center:nth-child(1) > .weu-table-cell > span');
    3.     const span2 = tr.querySelector('td.weu-table-column-center:nth-child(10) > .weu-table-cell > span');
    4. });
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 10:55
  • 签到天数: 61 天

    [LV.6]常住居民II

    14

    主题

    30

    回帖

    113

    积分

    中级工程师

    积分
    113
    发表于 2022-8-30 20:48:17 | 显示全部楼层
    遇到了用了get或each还是获取不到元素的情况,只能用定时器延迟几秒才能获取到
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-8-30 21:03:07 | 显示全部楼层
    player 发表于 2022-8-30 20:48
    遇到了用了get或each还是获取不到元素的情况,只能用定时器延迟几秒才能获取到 ...

    请具体描述一下,相关的网站和脚本代码,有没有错误信息等等。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 10:55
  • 签到天数: 61 天

    [LV.6]常住居民II

    14

    主题

    30

    回帖

    113

    积分

    中级工程师

    积分
    113
    发表于 2022-8-30 21:52:38 | 显示全部楼层

    cxxjackie 发表于 2022-8-30 21:03

    请具体描述一下,相关的网站和脚本代码,有没有错误信息等等。

        const elmGetter = new ElementGetter();
    
        let btn = document.querySelector("#root > div > div > div > div > div > div:nth-child(2) > div:nth-child(1) > button > span");
        console.log("原生:" + btn);
    
        elmGetter.get("#root > div > div > div > div > div > div:nth-child(2) > div:nth-child(1) > button > span").then(button => { console.log("get:" + button) });
    
        elmGetter.each("#root > div > div > div > div > div > div:nth-child(2) > div:nth-child(1) > button > span", document, button => {
            console.log("each:" + button);
        });
    
        setTimeout(() => {
    
            let btn = document.querySelector("#root > div > div > div > div > div > div:nth-child(2) > div:nth-child(1) > button > span");
            console.log("定时器:");
            console.log(btn);
    
        }, 3000);

    输出:
    没有报错,原生选择器为null,get 和each无输出信息,定时器正常。控制台正常。image

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-8-30 22:17:05 | 显示全部楼层
    player 发表于 2022-8-30 21:52
    [md]```
        const elmGetter = new ElementGetter();

    网站是哪个?
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 10:55
  • 签到天数: 61 天

    [LV.6]常住居民II

    14

    主题

    30

    回帖

    113

    积分

    中级工程师

    积分
    113
    发表于 2022-8-31 13:06:43 | 显示全部楼层

    那没办法了,网站是内网。网站是vue,有没有可能受生命周期影响
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-8-31 20:15:11 | 显示全部楼层
    player 发表于 2022-8-31 13:06
    那没办法了,网站是内网。网站是vue,有没有可能受生命周期影响

    这个就有点盲人摸象了,光看代码看不出问题在哪,库版本是最新的1.2.0吗?这个页面下获取其他元素有没有问题?还有选择器的写法,你这个是自动生成的吧,最好还是手动写一下。
    有一种极小的可能是MutationObserver被劫持过,可以试试在document-start阶段new ElementGetter,然后在onload里get和each。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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