Сценарий и область действия 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);