player 发表于 2023-11-25 17:36:49

cxxjackie 发表于 2023-11-24 22:00
get有数组功能呀,传入选择器数组,即返回元素数组。

我的意思的类似于querySelectorAll这这样的获取同id或类名的nodeList,而get总是获取第一个,数组选择器好像也只能是不一样的类名,传入多个同一类名也是相同的第一个。
而each的使用场景也不对,且有作用域的局限。
所以我期望能新增一个和get类似,但是能获取nodeList的功能。。。

cxxjackie 发表于 2023-11-25 22:12:28

player 发表于 2023-11-25 17:36
我的意思的类似于querySelectorAll这这样的获取同id或类名的nodeList,而get总是获取第一个,数组选 ...

这个需求本质上是对each功能的扩展,但是不好实现,因为列表何时加载完毕是不可知的,除非你明确知道需要几个,然后将列表长度作为参数传入,这样的话,简单包装下each方法即可实现:
elmGetter.gets = (selector, length) => new Promise(resolve => {
    const nodeList = [];
    elmGetter.each(selector, el => {
      nodeList.push(el);
      if (nodeList.length === length) {
            resolve(nodeList);
            return false;
      }
    });
});
将each回调包装成Promise,应该可以解决你所说的使用场景问题。

szzxc 发表于 2023-12-11 14:10:57

使用2.0版本,部分页面(内部页面)引用加载页面报了很多错误
Uncaugth TypeError: Cannot read property 'call' of undefined
at query (userscript.html?...... :71)
at filter(userscript.html?...... :146)
at eval(userscript.html?...... :53)
at Set.forEach(<anonymouus>)
at eval(userscript.html?...... :53)
at MutationObserver.eve(userscript.html?...... :52)

cxxjackie 发表于 2023-12-11 22:08:26

szzxc 发表于 2023-12-11 14:10
使用2.0版本,部分页面(内部页面)引用加载页面报了很多错误
Uncaugth TypeError: Cannot read property ' ...

根据错误信息推测是matches有问题,可能浏览器不兼容(那其他页面应该也会报错),或者该页面劫持了matches,可以尝试将脚本执行时机提升到document-start,让库获取到原始引用,还是不行的话,尝试改用XPath或JQuery选择器。这个问题就是一个原生API变成undefined了,可能的原因有很多,不太好定位。

szzxc 发表于 2023-12-12 09:03:38

本帖最后由 szzxc 于 2023-12-12 09:13 编辑

改为document-start 好像不报错了,但找不到相关的元素。。是不是因为元素是在iframe id = "zxcframe"里面的原因..要怎么定位到这个iframe 或者说网页的全部元素。 document-start加载又好像找不到iframe ..还没加载进来。

cxxjackie 发表于 2023-12-12 22:57:04

szzxc 发表于 2023-12-12 09:03
改为document-start 好像不报错了,但找不到相关的元素。。是不是因为元素是在iframe id = "zxcframe"里面 ...

match进iframe内执行脚本是最简单的,如果是同源iframe想在外部操作,可以先用get获取到iframe元素,再将iframe.contentDocument作为父节点来执行后续操作,还要考虑iframe是否加载完毕等问题,挺麻烦的。
可参考:https://bbs.tampermonkey.net.cn/thread-2895-1-1.html

LinLin00 发表于 2023-12-19 21:47:12

本帖最后由 LinLin00 于 2023-12-19 22:07 编辑

> (forum.php?mod=redirect&goto=findpost&pid=73580&ptid=2726)
> > 这个需求本质上是对each功能的扩展,但是不好实现,因为列表何时加载完毕是不可知的,除非你明确知道需要 ...

参考事件防抖 debounce 的思想,假定符合 selector 的元素连续出现,在某个指定的时间 delay 都没有再次出现之后,可以视为全部出现,以此来模拟 querySelectorAll 如何?

仿 elmGetter (opinionated version)
https://bbs.tampermonkey.net.cn/thread-5561-1-1.html
(出处: 油猴中文网)

肉豆蔻是中药嘞 发表于 2024-1-15 09:33:00

感谢楼主分享,已经在使用了

szzxc 发表于 2024-2-21 08:57:57

iframe内嵌页面好像获取不到相关元素

cxxjackie 发表于 2024-2-21 23:14:26

szzxc 发表于 2024-2-21 08:57
iframe内嵌页面好像获取不到相关元素

是否跨域?没有的话将iframe.contentDocument作为parent参数传入。
页: 3 4 5 6 7 8 9 10 11 12 [13] 14 15
查看完整版本: 异步获取元素的脚本库 ElementGetter