2009-08-09 1 views
1

Я пишу простой сценарий GreaseMonkey, в который встроен плагин jQuery с именем hoverIntent. (Я внедряю его, а не принимаю его, потому что это очень маленький плагин.)Использование плагинов jQuery внутри сценариев Greasemonkey

Моя проблема: после того, как плагин прикрепляет обработчик событий к объекту DOM, событие вызывает сообщение об ошибке: «jQuery не определен «.

Является ли вопрос вопросом? Вот весь мой сценарий:

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); 

Он отлично работает, когда я копировать вставить его, удаляя все специфические теги GM, и запустить его из моей консоли. И this is the plugin I am embedding.

ответ

1

Выполняется ли сценарий greasemonkey до или после onDOMLoaded? Вам может понадобиться, чтобы задержать выполнение скрипта до тех пор, после того, как скрипт JQuery не добыт в родительском окне, и загружается ...

Редактировать на комментарий:

Я не вижу document.ready бит в ваш код выше, хотя я вижу свой комментарий об этом ... Тем не менее, ваш комментарий немного слишком поздно в сценарии быть любое использование ... Это могло бы объяснить:

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

Независимо от того, что вы положили в раздел /* some code here */, если эта строка выполнена до того, как определено значение unsafeWindow.jQuery, вы все равно будете вызывать функцию на неопределенном объекте т ...

Чтение GreaseSpot wiki on unsafeWindow, он предлагает альтернативный подход:

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: ни один из моих ответов обязательно не имеет смысла, хотя, так как вы используете $ объект для нескольких линий перед выпуском представляет себя ..: -S странно.

+0

Хороший вопрос. Я понимаю, что пользовательские скрипты загружаются после загрузки DOM, но чтобы быть в безопасности, я использовал документ, готовый в моем скрипте, как вы можете видеть выше. – picardo