Сценарий и область действия Greasemonkey - PullRequest
7 голосов
/ 15 февраля 2009

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

    // ==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'а функции на странице, например this . Есть ли другой способ?

Спасибо.

Ответы [ 3 ]

14 голосов
/ 15 февраля 2009

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);
2 голосов
/ 15 февраля 2009

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

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

1 голос
/ 15 февраля 2009

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

window.test = function ...

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

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

window.addEventListener("load", function(e) {
 // Your main() here
}, false);
...