2009-02-15 15 views
6

Oto mój kod skryptu:Greasemonkey Script i Function Zakres

// ==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(); 

Jedynym problemem jest, gdy mam Hello World kliknięciu strona nie może znaleźć funkcji test(). Proszę mi powiedzieć, że nie muszę go rozwiązywać poprzez wewnętrzną funkcję HTTML na stronie takiej jak this. Czy istnieje inny sposób?

Dzięki.

Odpowiedz

13

Greasemonkey wykonuje skrypt w piaskownicy - strona nie ma do niego dostępu ze względów bezpieczeństwa. Wszystkie acceses do dom i window są przez wrappery.

Jeśli chcesz uzyskać dostęp do niezabezpieczonych obiektów, możesz użyć właściwości wrappedJSObject.

Twoim przypadku można użyć unsafeWindow (lub window.wrappedJSObject):

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

Istnieją pewne kwestie bezpieczeństwa z tym, patrz: http://wiki.greasespot.net/UnsafeWindow

Również Greasemonkey wykonuje skrypt po DOMContentLoaded (gdy dom jest gotowy), więc nie potrzebujesz tego nonsensu.

Ponadto, nie można używać atrybutów do ustawiania detektorów zdarzeń ani ich właściwości - do tego celu należy użyć funkcji dom api. Np:

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

czyli

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

+1. Dzięki. Byłbym wdzięczny za twoje przemyślenia na temat tego, gdzie utknąłem teraz. Opublikowaliśmy to na http://userscripts.org/topics/21770 Nie mogę uruchomić funkcji anod line inline. – BuddyJoe

+0

Powinienem dodać ... Otrzymuję zerową pomoc z konsoli błędów, jeśli chodzi o to, co dzieje się nie tak. – BuddyJoe

+0

To jest bilet !!! dzięki. – BuddyJoe

1

spróbuj dodać test funkcyjny do obiektu window

window.test = function ... 

Edycja

Ponadto, jest to dobry pomysł, aby uruchomić swój kod z „obciążenie” obsługi zdarzeń, a nie tylko poprzez wywołanie go na końcu twoich scenariuszy. np .:

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

window.test = function ... nie dla mnie. Nadal otrzymałem test nieokreślonego błędu. – BuddyJoe

+0

Czy wywołujesz window.test() w głównej? –

1

iirc, greasemonkey działa w swoim zakresie, więc test nie będzie w globalnej przestrzeni nazw.

Zamiast polutować globalnie, dlaczego nie utworzyć elementu kotwicy poprzez manipulację DOM? To zwróci ci refernece, które możesz powiązać z anonimową funkcją (lub testem z użyciem skrótu).

+0

Czy możesz trochę rozwinąć? Jak byś to zrobił, jeśli chcesz zachować funkcję "nieanonimową" (określaną w Greasemonkey). Co masz na myśli przez bind? – BuddyJoe

+0

Teraz tworzę kotwicę poprzez manipulację DOM. Ale nie rozumiem, jak poprawnie "związać" funkcję. – BuddyJoe

+0

Siadłem odpowiadając na to i zobaczyłem, że już tam jesteś :) – annakata