我注意到了 this userscript (这有充分的理由相当受欢迎)每当我在此选项卡中的视频上按下播放时,就会暂停另一个选项卡上的视频。来源被缩小了,但看起来就是这样 https://github.com/YePpHa/YouTubeCenter/blob/master/src/YouTubeCenter.user.js
我不知道从哪里开始,所以我搜索了所有“暂停”的实例。我以为是第 22801 行,但我不再这么认为了。我也无法理解发生了什么。在控制台中输入 ytcenter._intercomOnPlayer 得到了 undefined
。它下方的 8 行 (22809) 显示“ytcenter._intercomOnPlayer”,因此我认为我没有阅读正确的区域。我看到“@grant GM_xmlhttpRequest”。我查看了 firebug 中的网络选项卡,没有看到任何东西,至少没有看到任何相关的东西。
它如何与另一个选项卡通信以暂停视频?
最佳答案
我想这是负责任的:
ytcenter.player.network.pause();
我通过 wiki github 链接找到它 https://github.com/YePpHa/YouTubeCenter/wiki/Features#Only_One_Player_Instance_Playing在我寻找“Only_One_Player_Instance_Playing”短语的代码中
当然,选项卡之间也无法相互通信。它必须通过 youtube api 完成...
更新
我们那边有一个新问题。 ytcenter.player.network.pause()
行如何工作?
我无法自己运行代码。有一些错误,我懒得修复它。但我正在遵循 pause
方法。首先,我认为它是 youtube api 的原生功能,但我错了。是line 18600 .里面是另一把 key
intercom.emit("player", {
action: "pause",
origin: intercom.origin
});
这导致更深入的 emit
功能。正如您所猜到的,emit
也不是 youtube API 的原生函数。它调用 _emit
函数和一些事件。 _emit
是 line 10754 上的关键代码.到这里就结束了,里面有一些魔法,包括 localStorage
和 settimeout
。我相信这就是答案。本地存储是共享的,我在途中某处看到了 setInterval
函数。一旦视频暂停,它就会将消息发送到本地存储中,该存储只保留一小段时间。其他选项卡会通过 setInterval 注意到这一点。
关于javascript - 这个脚本如何暂停 youtube 视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691369/