jsxz445665 发表于 2022-10-27 23:26:58

哥哥们,能帮我看下这是哪里出的问题吗?

!(data/attachment/forum/202210/27/232307clqz8nb9snr29hnz.png)

哥哥们,麻烦帮忙看下我这里哪里的问题,把代码复制到控制台就可以找到元素并且运行


!(data/attachment/forum/202210/27/232413a7gfgndtxfkd8gg7.png)

但是写进油猴里运行,就找不到元素,不知道是哪里出的问题,麻烦大佬给看看~

李恒道 发表于 2022-10-27 23:26:59

善用论坛搜索
https://bbs.tampermonkey.net.cn/thread-835-1-1.html
页面加载与元素的那点破事

页面加载不等于元素已经出现,我们通常在f12控制台调试和查看的是现有的页面,并不代表页面加载完毕后就一定具备这个元素

尽管很多页面会在加载的时候就出现所有元素

但是也有很多页面,会在渲染完毕后,再根据xhr请求数据等方式,再在页面上绘制新的数据,这个时候如果我们在页面加载完毕和获取数据绘制之间进行获取元素

是获取不到的。

解决方法也很简单,

这里我提供两个常见的方法

1.使用Setinterval来进行循环判断,当获取元素不为空的时候继续执行,但需要注意不要创建过多的定时器,以及不使用的时候可以考虑销毁定时器

https://www.runoob.com/jsref/met-win-setinterval.html

2.通过DOM插入监控来判断

在bilibili的例子中我们已经搞过了,通过上层已经存在的元素对其进行dom监听,然后再插入的时候会触发这个函数,来进行一些操作

但是需要注意把握好下层元素的数量问题,如果绘制元素过多反复触发,会极大的延迟运行速度

let ops=document.querySelector('#arc_toolbar_report .ops');
//插入三连之后好像会重新生成,不添加就不会重新生成,暂时没弄清什么情况,先这样处理了.
//主要作用是监听ops的DOMNodeInserted事件,等它修改完成之后再插入我们的三连按钮,另外注意run-at是document-end,要等待ops生成之后再监听,不然query返回null会报错
//这个事件会多次调用,但是我们insertBefore插入如果元素存在,只是修改而不会新增
ops.addEventListener("DOMNodeInserted", function(event) {
    let share=document.querySelector('.share');
    share.parentElement.insertBefore(triple,share);
});

李恒道 发表于 2022-10-27 23:52:15

另外推荐使用
异步获取元素的脚本库 ElementGetter (更新至1.2.1)
https://bbs.tampermonkey.net.cn/thread-2726-1-1.html

王一之 发表于 2022-10-28 10:10:18

![图片.png](data/attachment/forum/202210/28/105844xuwmlihstsnhvu65.png)
我没懂

李恒道 发表于 2022-10-28 10:59:57

王一之 发表于 2022-10-28 10:10
![图片.png](data/attachment/forum/202210/28/105844xuwmlihstsnhvu65.png)
我没懂

每次如果有一个以上的人回答问题
我永远是被冷落的那个
steven说因为我不够长
这次我够长吧!
页: [1]
查看完整版本: 哥哥们,能帮我看下这是哪里出的问题吗?