Сценарий и область действия Greasemonkey

Вот мой код скрипта:

    // ==UserScript==
    // @name          test 
    // @description   test
    // @include       http://*
    // @copyright     Bruno Tyndall
    // ==/UserScript==

    var main = function() {
        var b = document.getElementsByTagName('body')[0];
        var t = document.createElement('div');
        t.innerHTML = '<a href="javascript:void(0);" style="color:white;">Hello World</a>';
        t.style.position = 'absolute';
        t.style.zIndex = 1000;
        t.style.bottom = '5px';
        t.style.right = '5px';
        t.firstChild.setAttribute('onclick', 'test();');
        b.appendChild(t);

    }

    var test = function() {
        alert("Hello World");
    }
    main();

Единственная проблема, с которой я сталкиваюсь, - это когда Hello World нажимается, страница не может найти функцию test(). Пожалуйста, скажите мне, что мне не нужно решать это, используя innerHTML'у функцию на странице, как это. Есть ли другой способ?

Благодарю.

3 ответа

Решение

Greasemonkey выполняет скрипт в песочнице - страница не имеет доступа к нему по соображениям безопасности. Все входы в дом и окно через обертки.

Если вы хотите получить доступ к незащищенным объектам, вы можете использовать wrappedJSObject имущество.

Для вашего случая вы можете использовать unsafeWindow (или же window.wrappedJSObject):

unsafeWindow.test = function() { ....

С этим связаны некоторые проблемы безопасности, см. http://wiki.greasespot.net/UnsafeWindow

Кроме того, greasemonkey выполняет сценарий после события DOMContentLoaded (когда dom готов), поэтому вам не нужна эта ерунда о загрузке.

Кроме того, вы не можете использовать атрибуты для установки прослушивателей событий или свойства в этом отношении - для этого вы должны использовать dom api. Например:

t.firstChild.addEventListener('click', test, false);

или же:

t.firstChild.addEventListener('click', function(event){ blabla }, false);

iirc, greasemonkey работает в своей области видимости, поэтому test не будет в глобальном пространстве имен.

Однако вместо того, чтобы опрашивать глобальные, почему бы не создать свой якорный элемент с помощью манипуляций с DOM? Это вернет вам ссылку, с которой вы можете связать анонимную функцию (или тест области действия greasemonkey).

Попробуйте добавить функциональный тест к объекту окна

window.test = function ...

редактировать

Кроме того, рекомендуется запускать код из обработчика событий load вместо простого вызова его в конце ваших сценариев. например:

window.addEventListener("load", function(e) {
 // Your main() here
}, false);
Другие вопросы по тегам