【问题标题】:How to call Youtube-Flash-API of existing Videos using Greasemonkey如何使用 Greasemonkey 调用现有视频的 Youtube-Flash-API
【发布时间】:2011-11-01 19:42:24
【问题描述】:

我想编写一个 Greasemonkey 脚本来检测网站上的 YouTube 视频何时开始播放以停止我的 winamp 播放音乐。一切正常,我的脚本检测到视频,启用 API 并且还调用了 onYouTubePlayerReady 事件。但我不知道如何注册onStateChange 回调,这是我的代码:

unsafeWindow.onYouTubePlayerReady = function (playerId)
{
    alert('Visible');

    document.getElementById(playerId).addEventListener('onStateChange', 'stateChanged');    

    alert('Not visible, so the line above crashes');
}

unsafeWindow.stateChanged = function (state)
{
    alert('never called, too');
}

这个问题有解决方案还是根本不可能?

【问题讨论】:

  • 不能用 Greasemonkey 做到这一点;您将不得不编写一个 Firefox 扩展/附加组件。
  • Greasemonkey 没有足够的系统权限与 Winamp 交互。另外,上面的代码有多个错误。
  • 我将使用 WifiAmp 与 winamp 交互,问题只是“onStateChange”上的监听器

标签: javascript youtube-api greasemonkey userscripts


【解决方案1】:

“问题只是“onStateChange”上的监听器“

好的,为了解决一些范围界定问题,最好只注入与 YouTube API 交互的代码。

以下适用于 Firefox+Greasemonkey、Chrome 或 Chrome+Tampermonkey。它也应该适用于任何支持用户脚本的浏览器:

function GM_main () {
    window.stateChanged = function (state) {
        console.log ('GM: In stateChanged().  State = ', state);
    }

    window.onYouTubePlayerReady = function (playerId) {
        /*-- playerId is not being set by Youtube. Use
            hard-coded id (movie_player) instead.
        */
        var playerNode  = document.getElementById ("movie_player");
        if (playerNode) {
            /*--- Note, inside onYouTubePlayerReady ONLY, the YouTube API
                seems to override addEventListener. Hence the nonstandard
                parameters.
            */
            playerNode.addEventListener ('onStateChange', 'stateChanged');

            console.log ('GM: Listener installed just fine.');
        }
        else
            console.error ("GM: Player node not found!");
    }
}

addJS_Node (null, null, GM_main);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

【讨论】:

  • 谢谢你的sn-p,你测试过吗?我在上面编辑了我的问题,添加事件侦听器时它仍然崩溃。我是不是忘记了什么?
  • 是的,我测试过了。您将在 Firebug 控制台上看到 State = 消息闪过。在已编辑的问题中,有许多转录错误:var 不应该存在的声明、额外的引号等。从我的代码开始,完全正确。在 FF 控制台上查看结果,或者更好的是,安装 Firebug 并使用其控制台。
  • 谢谢,成功了!我的一个问题是,我使用 而不是 ,在我改变它之后,一切正常!如果我有时间完成它,我会将我的最终代码发布为greasemonkey脚本......
  • 您应该更新您的示例代码,因为 E4X 已从 Firefox 中删除。
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 2011-12-26
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2012-07-04
  • 2016-11-13
相关资源
最近更新 更多