2009-08-09 7 views
1

J'écris un script GreaseMonkey simple dans lequel un plugin jQuery nommé hoverIntent est incorporé. (Je l'incorpore plutôt que de l'héberger car c'est un très petit plugin.)Utilisation de plugins jQuery dans des scripts Greasemonkey

Mon problème: après que le plugin attache son gestionnaire d'évènement à un objet DOM, l'évènement déclenche un message d'erreur qui dit: "jQuery n'est pas défini "

Est-ce un problème de portée? Voici mon script entier:

if(unsafeWindow.console){ 
     var GM_log = unsafeWindow.console.log; 
    } 


    (function($){ 
      //HoverIntent 
      $.fn.hoverIntent=function(f,g){...}; 
      //Removed the plugin code. You can see it in the link at the bottom 
      //of the post. 



    //DOM is ready 
    //Fetch all the rows with arrows 
    $('.arrow') 
     .each(function(){ 
      $(this).hoverIntent(mouseOver,mouseOut);    
     }); 

    //mouseOver 
    function mouseOver(){ 
     //THIS IS WHERE THE ERROR HAPPENS 
     $(this).click(); 
    } 

    //mouseOut 
    function mouseOut(){ //nothing here. 
    } 

    })(unsafeWindow.jQuery); 

Il fonctionne très bien quand je copie le coller, supprimer tous les balises spécifiques GM, et l'exécuter à partir de ma console. Et this is the plugin I am embedding.

Répondre

1

Est-ce que le script greasemonkey est exécuté avant ou après onDOMLoaded? Vous devrez peut-être retarder l'exécution du script jusqu'à ce que le script jQuery provient par la fenêtre parent et chargé ...

Modifier par commentaire:

Je ne vois pas le bit document.ready dans votre code ci-dessus, même si je vois vos commentaires à ce sujet ... Cependant, votre commentaire est un peu trop tard dans le script à toute utilisation ... Cela pourrait expliquer:

(function($){ /* some code here */ })(unsafeWindow.jQuery) 

peu importe ce que vous mettez la section /* some code here */, si cette ligne est exécutée avant la définition de unsafeWindow.jQuery, vous appelez toujours une fonction sur un objet non défini t ...

La lecture du GreaseSpot wiki on unsafeWindow, il suggère l'approche alternative:

var script = document.createElement("script"); 
script.type = "application/javascript"; 
script.innerHTML = "(function($){ 
     //HoverIntent 
     $.fn.hoverIntent=function(f,g){...}; 
     //Removed the plugin code. You can see it in the link at the bottom 
     //of the post. 



    //DOM is ready 
    //Fetch all the rows with arrows 
    $('.arrow') 
     .each(function(){ 
       $(this).hoverIntent(mouseOver,mouseOut);     
     }); 

    //mouseOver 
    function mouseOver(){ 
     //THIS IS WHERE THE ERROR HAPPENS 
     $(this).click(); 
    } 

    //mouseOut 
    function mouseOut(){ //nothing here. 
    } 

})(jQuery);"; 

document.body.appendChild(script); 

Edit: aucun de mes réponses font nécessairement sens, cependant, puisque vous utilisez l'objet $ pour quelques lignes avant que le problème se présente ..: -S bizarre.

+0

Bonne question. Ma compréhension est que les scripts d'utilisateurs sont chargés après que le DOM soit chargé, mais juste pour être du bon côté, j'ai utilisé un document prêt dans mon script comme vous pouvez le voir ci-dessus. – picardo

Questions connexes