抖音web页面 为了选中上面的元素,使用 $("span.arnSiSbK.ypGAC_xH.ONzzdL2F")
遇到的问题
鼠标滚轮 滚动下一个/上一个视频. 控制台使用 $("span.arnSiSbK.ypGAC_xH.ONzzdL2F")
输出的名称和当前播放的视频的 用户名称不一致. 如下
抖音web页面 为了选中上面的元素,使用 $("span.arnSiSbK.ypGAC_xH.ONzzdL2F")
鼠标滚轮 滚动下一个/上一个视频. 控制台使用 $("span.arnSiSbK.ypGAC_xH.ONzzdL2F")
输出的名称和当前播放的视频的 用户名称不一致. 如下
这种情况通常是由于 JavaScript 和 DOM(文档对象模型)之间的异步更新导致的。在网页中,尤其是像抖音这样的动态内容丰富的网页,内容可能会在页面上的用户交互(如滚动、点击等)之后异步更新。当你使用 jQuery 的 $
选择器在控制台中查询元素时,如果此时页面的内容已经由于用户的交互而更新,但 JavaScript 引擎尚未处理完这些更新事件,那么你的查询结果可能会反映更新之前的状态。
解决方案:
确保 DOM 更新完成:
在使用选择器之前,确保相关的 DOM 更新已经完成。这可以通过在事件处理函数的回调中使用选择器来实现,或者通过设置一个小的延时(使用 setTimeout
)来等待 DOM 更新完成。
setTimeout(() => {
const userNameElement = $("span.arnSiSbK.ypGAC_xH.ONzzdL2F");
console.log(userNameElement.text());
}, 100); // 延时100毫秒,根据实际情况调整
使用 MutationObserver:MutationObserver
是一个可以监视 DOM 树变动的接口,当 DOM 变动时,它可以异步执行一个回调函数。这可以用来监听特定元素的变动,并在变动发生时执行相应的操作。
const observer = new MutationObserver((mutationsList, observer) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList' || mutation.type === 'attributes') {
const userNameElement = $("span.arnSiSbK.ypGAC_xH.ONzzdL2F");
console.log(userNameElement.text());
}
}
});
const targetNode = document.querySelector('父元素的选择器'); // 替换为实际父元素的选择器
observer.observe(targetNode, { childList: true, attributes: true });
// 记得在不再需要观察时调用 observer.disconnect()
在事件回调中查询:
如果你知道哪个事件触发了 DOM 更新(例如滚动事件),可以在该事件的处理函数中进行查询。
$(window).on('scroll', function() {
setTimeout(() => {
const userNameElement = $("span.arnSiSbK.ypGAC_xH.ONzzdL2F");
console.log(userNameElement.text());
}, 50); // 根据实际情况调整延时
});
注意,由于网页可能使用了框架或库(如 React, Vue 等),DOM 的更新可能由这些框架管理,并且可能不会立即反映到底层的 DOM 树中。此外,类名如 arnSiSbK.ypGAC_xH.ONzzdL2F
看起来像是动态生成的,这些类名可能会随着页面或应用的更新而改变,因此使用更稳定的选择器(如数据属性或 ID)可能是一个更好的选择(如果可用)。
10 回答10.6k 阅读
4 回答8.7k 阅读✓ 已解决
7 回答10.8k 阅读
2 回答11.4k 阅读✓ 已解决
6 回答2.6k 阅读
5 回答4.4k 阅读✓ 已解决
4 回答2.6k 阅读✓ 已解决
因为一个页面有很多的视频,不是只有当前窗口内的一个视频,所以你用选择器选择的都是第一个视频下的作者,看下他的dom结构,当前播放的视频带有属性

data-e2e="feed-active-video"
,可以使用选择器$("[data-e2e='feed-active-video'] span.arnSiSbK.ypGAC_xH.ONzzdL2F")
进行输出