如何使用Greasemonkey调用现有视频的Youtube-Flash-API

Tho*_*sen 2 javascript greasemonkey youtube-api userscripts

我想写一个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');
}
Run Code Online (Sandbox Code Playgroud)

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

Bro*_*ams 7

"问题只是"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);
}
Run Code Online (Sandbox Code Playgroud)