【问题标题】:setTimeout() not working with waitForKeyElements on Tampermonkey?setTimeout() 不能与 Tampermonkey 上的 waitForKeyElements 一起使用?
【发布时间】:2022-01-07 17:39:12
【问题描述】:

我有一个脚本,目前可以消除那些讨厌的“继续看?”使用 Tampermonkey 和 waitForKeyElements(在 Google Chrome 中)在 YouTube 上自动播放视频时的提示。如果您只是不间断地观看视频,它们会不时弹出。以下是我所指的:

这是消除它们的脚本:

// ==UserScript==
// @name     YouTube Yes SJ3
// @include  https://www.youtube.com/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==

waitForKeyElements ("a.yt-simple-endpoint.style-scope.yt-button-renderer:contains('Yes')", clicks);

function clicks (jNode) {
    var clickEvent = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);
    console.log('SJ3');
    waitForKeyElements ("a.yt-simple-endpoint.style-scope.yt-button-renderer:contains('Yes')", clicks);
}

虽然这个脚本似乎成功地点击了每个“继续观看?”提示,根据控制台,如果单击第二个提示(或除自动播放序列中的第一个以外的任何视频),脚本会一次又一次地快速且无限期地运行。然后,我的 CPU/RAM 使用率飙升。

现在我不确定原因,但可能是“继续观看?”除了第一个视频之外,任何视频上的提示在单击后都会被隐藏,这可能是脚本尝试无限触发的原因。

所以为了解决这个问题,我想我会尝试延迟函数中的最后一行代码,以便在单击后每 30 秒检查一次。所以我使用了setTimeout()。这是更新的代码:

// ==UserScript==
// @name     YouTube Yes 10SJX
// @include  https://www.youtube.com/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==

waitForKeyElements ("a.yt-simple-endpoint.style-scope.yt-button-renderer:contains('Yes')", clicks);

function clicks (jNode) {
    var clickEvent = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);
    console.log('10Clicked');
    setTimeout(() => { waitForKeyElements ("a.yt-simple-endpoint.style-scope.yt-button-renderer:contains('Yes')", clicks); }, 30000);
}

但它似乎没有执行setTimeout() 行。它会单击第一个提示,但不会单击出现的以下提示。如何在通过 waitForKeyElements 再次检查选择器之前成功让我的脚本等待 X 时间?

最终,我该如何消除反复出现的“继续观看”?在 YouTube 上使用 waitForKeyElements 提示?

【问题讨论】:

    标签: javascript youtube userscripts


    【解决方案1】:

    <video> 元素暂停时,会触发pause event。如果你听了,检查弹出窗口是否存在,然后关闭它,你应该没问题:

    // ==UserScript==
    // @name     YouTube Yes 10SJX
    // @include  https://www.youtube.com/*
    // @grant    GM_addStyle
    // ==/UserScript==
    
    (function() {
        const videoElement = document.querySelector('video');
        const yesButtonSelector = "a.yt-simple-endpoint.style-scope.yt-button-renderer";
    
        videoElement.addEventListener('pause', () => {
            // the video has been paused; check if popup exists
            const yesButton = [...document.querySelectorAll(yesButtonSelector)]
                .find(element => element.innerText === 'Yes');
            if (!yesButton) return; // probably paused by user
    
            yesButton.click(); // dismiss
            videoElement.play(); // and resume
        });
    })();
    

    【讨论】:

    • 谢谢,您的帮助非常大。我假设我应该删除选择器的 contains: 部分,因为它是 jQuery?或者我想我可以加回@require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js?我很快就会测试它。
    • 所以它似乎完全忽略了“继续观看?”提示并继续播放(在我的情况下这很好),但它会无限期地重复出现提示的视频。所以我想新的挑战是让它在自动播放给出提示的视频时转到一个新视频。我正在考虑可能只是在视频暂停或选择器出现时强制刷新。
    • @theCrabNebula 哎呀!我完全忘记了:contains() 是 jQuery。我更新了代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多