Как вызвать Youtube-Flash-API существующих видео с помощью Greasemonkey - PullRequest
2 голосов
/ 01 ноября 2011

Я хочу написать сценарий 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');
}

Есть ли решение этой проблемы или просто невозможно?

1 Ответ

7 голосов
/ 02 ноября 2011

"проблема только в слушателе" onStateChange ""

Хорошо, чтобы обойти некоторые проблемы с областями видимости, лучше всего просто внедрить код, который взаимодействует с API YouTube.

Следующее работает в 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);
}
...