在页面之间保留的元素

Elements persisting between pages

提问人:AlwaysLearning 提问时间:7/30/2023 更新时间:7/30/2023 访问量:37

问:

我写了一个内容脚本在 YouTube 中运行:

let id = '';
while (true) {
    let newId = await getVideoId(true);
    if (newId && newId !== id) {
        console.log('New id', newId);
        await handleVideo();
        id = newId;
    }
    await pause(50);
}

每当用户访问另一个视频时,都会与 DOM 元素进行交互。在内部,使用以下方法在元素可用时立即获取该元素:handleVideohandleVideomyQuerySelector

function pause(delay) {
    return new Promise((resolve) => setTimeout(resolve, delay));
}

// Wait for at most maxDelay time
async function myQuerySelector(selector, all = false, maxDelay = 10000) {
    const delay = 50; //ms
    let totalDelay = 0;
    let elements = [];
    while (totalDelay <= maxDelay) {
        elements = Array.from(document.querySelectorAll(selector))
        if (elements.length) break;
        await pause(delay);
        totalDelay += delay;
    }
    console.log(`Found after ${totalDelay}`, selector)
    return all ? elements : elements[0];
}

我面临的困难是,当我访问一个新视频时,这些元素可以立即使用,但我从这些元素中获得的内容是上一个视频中的内容。如何确保元素已更新?

P.S. 最奇怪的是,即使用户访问两个视频之间的频道页面,也会发生这种情况。在这种情况下,元素如何持续存在?

javascript dom google-chrome-extension

评论

0赞 Carcigenicate 7/30/2023
Afaik,YouTube 是一个 SPA(单页应用程序)。只有一页。当您“导航”时,页面上的 JS 只是使用新内容重写页面。
0赞 AlwaysLearning 7/30/2023
@Carcigenicate 那么,我能做些什么来确保我得到的是与当前视频相关的内容呢?
0赞 Carcigenicate 7/30/2023
您可以找到在导航时触发的事件,并在其上设置事件侦听器,以便在触发该事件时重新运行代码。
0赞 AlwaysLearning 7/30/2023
@Carcigenicate 你指的是什么导航?我已经发现导航到另一个视频......
0赞 wOxxOm 7/30/2023
这意味着你发现得太早了。请参阅此示例或使用 MutationObserver 检测元素中的更改,而不是 setTimeout。

答: 暂无答案