#javascript #youtube-api #greasemonkey #userscripts
#javascript #youtube-api #greasemonkey #пользовательские скрипты
Вопрос:
Я хочу написать скрипт 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. Вы не можете сделать это с помощью Greasemonkey; вам придется написать расширение / дополнение для Firefox.
2. У Greasemonkey недостаточно системных привилегий для взаимодействия с Winamp. Кроме того, в приведенном выше коде есть несколько ошибок.
3. Я буду использовать WifiAmp для взаимодействия с winamp, проблема заключается только в прослушивателе «onStateChange»
Ответ №1:
«проблема только в слушателе на «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);
}
Комментарии:
1. Спасибо за этот фрагмент, вы это тестировали? Я отредактировал свой вопрос выше, он по-прежнему вылетает при добавлении прослушивателя событий. Я что-то забыл?
2. Да, я это тестировал. Вы увидите
State =
, как сообщения будут мигать на консоли Firebug. В отредактированном вопросе есть многочисленные ошибки транскрипции:var
объявления, которых там не должно быть, дополнительные кавычки и т. Д. Начните именно с моего кода. Просмотрите результаты на консоли FF или, что еще лучше, установите Firebug и используйте его консоль.3. Спасибо, это сработало! Одна из моих проблем заключалась в том, что я использовал <object> вместо <embed> , после того, как я это изменил, все работало нормально! Я опубликую свой окончательный код в виде скрипта greasemonkey, если найду время его закончить…
4. Вы должны обновить свой пример кода, потому что E4X был удален из Firefox.