1

我正在编写一个简单的 GreaseMonkey 脚本,其中嵌入了一个名为 hoverIntent 的 jQuery 插件。(我嵌入它而不是托管它,因为它是一个非常小的插件。)

我的问题:在插件将其事件处理程序附加到 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 特定标签并从我的控制台运行它时,它工作正常。这是我嵌入的插件

4

1 回答 1

1

Greasemonkey 脚本是在 onDOMLoaded 之前还是之后运行的?您可能需要延迟脚本的执行,直到 jQuery 脚本由父窗口获取并加载...

根据评论编辑:

我在上面的代码中没有看到 document.ready 位,尽管我看到了您对此的评论...但是,您的评论在脚本中有点太晚了,无法使用...这可以解释:

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

无论您在该/* some code here */部分中放置了什么,如果在定义之前执行此行unsafeWindow.jQuery,您仍然会在未定义的对象上调用函数...

在 unsafeWindow 上阅读GreaseSpot wiki,它建议了以下替代方法:

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

编辑:不过,我的答案都不一定有意义,因为您$在问题出现之前使用了该对象几行...... :-S 很奇怪。

于 2009-08-09T13:45:42.583 回答