Chrome отказывается объявлять переменную во вставленном скрипте - PullRequest
2 голосов
/ 20 января 2012

У меня есть скрипт Greasemonkey, который внедряет javascript в страницу, которая должна добавить гиперссылку, которая при нажатии вызывает переменную.Переменная - это функция, которая скрывает ссылку и показывает игрока.Однако, когда я нажимаю на ссылку, журнал ошибок страницы говорит, что playaudio не определен.Вот мой код:

// ==UserScript==
// @name          AudioPlayer
// @include       http://mysite.com/*
// ==/UserScript==
function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn.toString() + ')();';
    document.body.appendChild(script); // run the script
    //document.body.removeChild(script); // clean up
}
window.addEventListener("load", function () {
    exec(function () {
        jQuery(".field-name-field-mp3link").append('<audio controls="" autoplay="" style="margin-left:10px; display:none;" src=""></audio>');
        var playaudio = (function () {
            jQuery('.field-name-field-mp3link > audio').attr('src', jQuery('.field-name-field-mp3link > .field-items > .field-item > a').attr('href'));
            jQuery('.field-name-field-mp3link > audio').css('display', 'block');
            jQuery('.field-name-field-mp3link > a').css('display', 'none');
        });
        jQuery(".field-name-field-mp3link").append('<a href="javascript:playaudio();" style="margin-right:5px;">Listen</a>');
    });
}, false);

Я должен добавить, что он отлично работает, когда я использую встроенную консоль Chrome Javascript для запуска кода.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Судя по всему, вы объявляете playaudio локальным для функции, поэтому нажатие на гиперссылку javascript:playaudio(); не будет работать, поскольку playaudio не входит в глобальную область.

РЕДАКТИРОВАТЬ: Сохраняя playaudio в локальной области, как указано выше, и вызывая его через обработчик щелчков на вставленном элементе, вы можете избежать загрязнения глобальной области документа, особенно, например, если документуже был метод "playaudio" в окне до того, как ваш скрипт был введен ...

0 голосов
/ 20 января 2012

Похоже, что ваша переменная playaudio связана с контекстом анонимной функции, выполняемой exec.

href javascript:playaudio(); является вызовом playaudio в глобальном контексте, т.е.window.playaudio который действительно оставлен неопределенным.

Попробуйте заменить var playaudio на window.playaudio.

...