7 votes

<script> Titre </script>

Voici mon code script :

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

Le seul problème que j'ai est lorsque Hello World est cliqué, la page ne peut pas trouver la fonction test(). Pouvez-vous me dire que je n'ai pas à le résoudre en plaçant la fonction avec innerHTML sur la page comme cela. Y a-t-il une autre façon de le faire ?

Merci.

14voto

Steve Cooley Points 279

Greasemonkey exécute le script dans un bac à sable - la page n'y a pas accès pour des raisons de sécurité. Tous les accès au dom et à la fenêtre se font via des wrappers.

Si vous voulez 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 cela, voir: http://wiki.greasespot.net/UnsafeWindow

De plus, Greasemonkey exécute le script après l'événement DOMContentLoaded (lorsque le dom est prêt) donc vous n'avez pas besoin de ce nonsense de onload.

Aussi, vous ne pouvez pas utiliser d'attributs pour définir des écouteurs d'événements, ou des propriétés pour cette question - vous devez utiliser l'api du dom pour cela. Par exemple:

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

ou:

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

2voto

annakata Points 42676

Si je me souviens bien, greasemonkey s'exécute dans sa propre portée, donc test ne sera pas dans l'espace de noms global.

Au lieu de polluer le global, pourquoi ne pas créer votre élément ancre par la manipulation du DOM? Cela vous renverra une référence à laquelle vous pourrez lier une fonction anonyme (ou le test dans la portée de greasemonkey).

1voto

Assaf Lavie Points 20181

Essayez d'ajouter la fonction test à l'objet window

window.test = function ...

Modifier

De plus, il est judicieux d'exécuter votre code à partir d'un gestionnaire d'événements 'load' au lieu de simplement l'appeler à la fin de vos scripts. par exemple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X