【问题标题】:GreaseMonkey + Youtube + .click()GreaseMonkey + Youtube + .click()
【发布时间】:2025-11-28 20:15:02
【问题描述】:

目标:我加载一个 YouTube 播放列表,然后 GreaseMonkey click()s “随机播放列表”按钮。

我可以在我的控制台中直接运行这两行代码,而且效果很好:

var shuffleBtn = document.querySelector(".yt-uix-button.shuffle-playlist");
shuffleBtn.click();

但是,当我尝试将其移至 GreaseMonkday 时,它不再起作用。 下面代码中的console.log运行——并且(注释掉的)remove() 有效,但click()不会触发。我也试过 method outlined here,没有 jQuery 位,但也没有运气。

我错过了什么?

// ==UserScript==
// @name        YouTube - Randomize Playlist
// @namespace   ytplaylistrandom
// @include     https://www.youtube.com/watch?v=yyDUC1LUXSU&list=PLh6vppUwmWEMdp04u-tYABoDmgn9AX12n
// @version     1
// @grant       none
// ==/UserScript==

window.onload = function () {
    var shuffleBtn = document.querySelector(".yt-uix-button.shuffle-playlist");
    if( shuffleBtn ){
      console.log('exists');
      shuffleBtn.click();
      //shuffleBtn.remove();
      console.log('end');
    }else {
      console.log('nobutton');
    }
}

【问题讨论】:

  • 我已经对其进行了一些测试......它应该确实可以工作,因为在 GreaseMonkey 中不会阻止程序化点击(我已经做过很多次了)。我想,也许按钮没有正确初始化,但即使通过setTimeout 延迟执行,它似乎也不起作用。
  • 似乎当用户脚本执行时,随机播放按钮“丢失”了它的两个 click 事件监听器之一:there are two event listeners without the script,但 only one event listener with the script
  • 是的,我也用setTimeout.trigger('click') 尝试过,并尝试了整个过程 jQuery...

标签: javascript youtube click greasemonkey


【解决方案1】:

我想我明白了:

使用window.addEventListener("load", function(){}) 而不是window.onload = function(){}

似乎window 已经有一个onload 函数来初始化随机播放按钮的功能,并且脚本覆盖它。

【讨论】:

  • 成功了,谢谢!为了清楚起见,我仍然必须将其包装在 setTimeout
  • @frogg3862 这真的很奇怪……没有它对我有用。
  • 我还在.toggle-loop 中添加了click()s 以使播放列表循环播放——并添加.ytp-next-button 以继续播放下一首歌曲(启动“随机化”)