Подтвердить что ты не робот

UserScripts & Greasemonkey: вызов функций JavaScript на веб-сайте

Я создаю расширение UserScript для Firefox и Chrome, и я пытаюсь использовать некоторый код на веб-сайте JavaScript, например:

function: myFunction(){
    return  Grooveshark.playNextSong();
}

Проблема заключается в том, когда я тестирую этот код, Grooveshark является пустой ссылкой.

Я знаю, что есть другие люди, которые это сделали:

см. BetterGrooveshark

Но я не знаю, почему мое простое расширение не может вызвать функции JavaScript Grooveshark.

Нужно ли "добавить" мой script в документ, чтобы это работало?: document.document.body.appendChild(script);

Не добавляет ли Greasemonkey мои расширения JavaScript? Может кто-нибудь прояснить это для меня, пожалуйста.

Спасибо.

4b9b3361

Ответ 1

Фон

Не добавляет ли Greasemonkey мои расширения JavaScript? Может кто-нибудь прояснить это для меня, пожалуйста.

Greasemonkey выполняет ваши скрипты в sandbox, которая является ограниченной средой без прямого доступа к JavaScript на странице. Более ранние версии Greasemonkey вводили скрипты непосредственно на страницу, но это приводило к серьезным уязвимостям безопасности. В старой модели скрипты выполнялись с повышенными правами браузера chrome, что позволяло удаленным страницам получать доступ к встроенным функциям Greasemonkey с помощью (источник)

Когда вы получаете доступ к объекту window из Greasemonkey script сегодня, то вы получаете объект , который косвенно ссылается на фактический window свойства. Этот объект-обертку можно безопасно модифицировать, но важные ограничения. Доступ к фактическому объекту окна обеспечивается unsafeWindow (сокращенное обозначение window.wrappedJSObject). Использование unsafeWindow повторно открывает все исходные проблемы безопасности Greasemonkey и недоступно в Chrome. Его следует избегать, когда это возможно.

Хорошая новость: существует безопасный способ работы с новой безопасностью модели Greasemonkey по крайней мере двумя способами.

Script Инъекция

Теперь, когда скрипты Greasemonkey могут безопасно обращаться к DOM, тривиально: вставить тег <script> в <head> целевого документа, Создайте такую ​​функцию:

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

Прост в использовании:

exec(function() {
    return Grooveshark.playNextSong();
});

Местоположение Hack

Script В некоторых случаях инъекция может быть чрезмерной, особенно если вам нужно только изменить значение переменной на странице или выполнить одну функцию. Location Hack использует javascript: URL для доступа к коду в содержимом документа. Это очень похоже на запуск букмарклета из Greasemonkey script.

location.assign("javascript:Grooveshark.playNextSong();void(0)");

Бонус Script

Здесь представлен полный Greasemonkey script, который демонстрирует приведенные выше примеры. Вы можете запустить его на этой странице.

// ==UserScript==
// @name           Content Function Test
// @namespace      lwburk
// @include        http://stackoverflow.com/questions/5006460/userscripts-greasemonkey-calling-a-websites-javascript-functions
// ==/UserScript==

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script); // run the script
    document.body.removeChild(script); // clean up
}

window.addEventListener("load", function() {
    // script injection
    exec(function() {
        // alerts true if you're registered with Stack Overflow
        alert('registered? ' + isRegistered);
    });
    // location hack
    location.assign("javascript:alert('registered? ' + isRegistered);void(0)");
}, false);

Ответ 2

Функции и переменные, объявленные в сценариях GreaseMonkey (и пользовательских скриптов Chrome), сохраняются отдельно от объявленных веб-страницей по понятным причинам. Для сценариев GM в Firefox вы можете получить доступ к глобальным переменным через unsafeWindow.

Лучшим подходом к обеспечению безопасности и совместимости является внедрение ваших функций на страницу с помощью элемента script. Я использую следующий фрагмент в моих пользовательских скриптах:

function addFunction(func, exec) {
  var script = document.createElement("script");
  script.textContent = "-" + func + (exec ? "()" : "");
  document.body.appendChild(script);
}

В "-" здесь определенная функция анализируется как выражение, так что exec можно использовать для немедленного выполнения при ее добавлении. Вы вызываете функцию следующим образом:

function myFunction () {
    return Grooveshark.playNextSong();
}

// Inject the function and execute it:
addFunction(myFunction, true);