2009-02-15 9 views
6

Voici mon code de script:Greasemonkey Script et fonction Portée

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

La seule question que j'ai est quand Bonjour tout le monde est cliqué la page ne peut pas trouver la fonction test(). S'il vous plaît dites-moi que je n'ai pas à le résoudre par innerHTML'ing la fonction sur la page comme this. Y a-t-il un autre moyen?

Merci.

Répondre

13

Tous les accès à dom et window sont via des wrappers.

Si vous souhaitez accéder aux objets non sécurisés, vous pouvez utiliser la propriété wrappedJSObject.

Pour votre cas, vous pouvez utiliser unsafeWindow (ou window.wrappedJSObject):

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

Il y a quelques problèmes de sécurité avec ce sujet, voir: http://wiki.greasespot.net/UnsafeWindow

, Greasemonkey Réalise également le script après la DOMContentLoaded (lorsque le dom est prêt), donc vous n'avez pas besoin de ce non-sens.

De même, vous ne pouvez pas utiliser d'attributs pour définir des écouteurs d'événement ou des propriétés, vous devez utiliser dom api pour cela. Par exemple:

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

ou:

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

+1. Merci. J'apprécierais vos pensées sur où je suis coincé maintenant. Je l'ai posté sur http://userscripts.org/topics/21770 Je ne peux pas obtenir la fonction anon en ligne pour travailler non plus. – BuddyJoe

+0

Je devrais ajouter ... Je reçois aucune aide de la console d'erreur en ce qui concerne ce qui ne va pas. – BuddyJoe

+0

C'est le ticket !!! Merci. – BuddyJoe

1

Essayez d'ajouter le test de fonctionnement à l'objet fenêtre

window.test = function ... 

Modifier

En outre, il est une bonne idée d'exécuter votre code à partir d'un gestionnaire d'événements « de charge » au lieu de simplement en l'appelant à la fin de vos scripts. .: par exemple

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

+1

La window.test = fonction ... ne fonctionne pas pour moi. encore m'a donné le test erreur non définie. – BuddyJoe

+0

Appelez-vous window.test() dans main? –

1

IIRC, exécute Greasemonkey au sein de son propre champ, donc test ne sera pas dans l'espace de noms global. Au lieu de poluer le global, pourquoi ne pas créer votre élément d'ancrage à travers la manipulation DOM? Cela vous renverra une refernece que vous pouvez lier une fonction anonyme (ou le test de portée greasemonkey). Greasemonkey exécute le script dans un bac à sable - la page n'y a pas accès pour des raisons de sécurité.

+0

Pouvez-vous élaborer un peu? Comment le feriez-vous si vous voulez garder la fonction "non-anonyme" (étendue dans Greasemonkey). Que voulez-vous dire par lier? – BuddyJoe

+0

Je crée l'ancre via la manipulation DOM maintenant. Mais je ne vois pas comment "lier" la fonction correctement. – BuddyJoe

+0

Je satrted répondre à cela et puis vu que vous y êtes déjà arrivé :) – annakata

Questions connexes