根据正在运行的Greasemonkey脚本,使jQuery和GM_addStyle在Chrome用户脚本中工作

时间:2011-12-24 11:21:20

标签: javascript google-chrome greasemonkey userscripts

我写了一个简单的Greasemonkey script,用于在天桥弹出窗口中放大缩略图。它使用了很多jQuery。它适用于Firefox。但不在Chrome上,因为它不支持@require。

我遇到了solution这个问题。但是,即使我将它与get-around代码集成在一起,该脚本也无法在Chrome上运行。我只是将所有脚本代码放在解决方案代码的主函数中。

是不是错了?如果有人能指出问题出在哪里,以及我能做些什么来做到正确,那将非常感激。

function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

function main() 
{
  $("body").append ('<div id="idLargePicturePopupWindow"><img></div>');

$('#idLargePicturePopupWindow').bind 
(
    "mouseenter mouseleave",
    {bInPopup: true},
    myImageHover
);

$('#profPhotos .profPhotoLink > img').bind 
(
    "mouseenter mouseleave",
    {bInPopup: false},
    myImageHover
);

function myImageHover (zEvent) 
{
    if (zEvent.type == 'mouseenter') 
    {

        if ( ! zEvent.data.bInPopup) 
        {

            var imgurl = this.src.toString();
            var bigimg = imgurl.replace(/\/thumbs\/[0-9x]+\//i, "/photos/");

            $("#idLargePicturePopupWindow img").attr ('src', bigimg);
        }

        $("#idLargePicturePopupWindow").show();
    }
    else 
    {
        $("#idLargePicturePopupWindow").hide();
    }
}

GM_addStyle ( (<><![CDATA[
    #idLargePicturePopupWindow 
    {
        position:               absolute;
        background:             white;
        border:                 none;
        margin:                 1ex;
        opacity:                1.0;
        z-index:                1222;
        min-height:             100px;
        min-width:              200px;
        padding:                0;
        display:                none;
        top:                    2em;
        left:                   50em;
    }
    #idLargePicturePopupWindow img 
    {
        margin:                 0;
        margin-bottom:          -4px;
        padding:                0;
    }
]]></>).toString () );
}

addJQuery(main);

1 个答案:

答案 0 :(得分:2)

两个主要问题和1个可能的问题:

1)不要将GM_addStyle()包裹在main()函数中。 GM_addStyle()仅适用于脚本范围,它无法注入目标页面(这是main()addJQuery()业务所做的事情。

2)当前代码使用E4X制作多行字符串以发送给GM_addStyle(),但Chrome不支持E4X。

唉,the multiline string hack that Chrome does support (for now)在Firefox中不起作用。

如果您希望同时支持两种浏览器,那么使用GM_addStyle()编写真实样式会稍微困难一些。使用多行转义字符(\),如下所示:

GM_addStyle ( "                                 \
    #idLargePicturePopupWindow  {               \
        position:               absolute;       \
        background:             white;          \
        border:                 none;           \
        margin:                 1ex;            \
        opacity:                1.0;            \
        z-index:                1222;           \
        min-height:             100px;          \
        min-width:              200px;          \
        padding:                0;              \
        display:                none;           \
        top:                    2em;            \
        left:                   50em;           \
    }                                           \
    #idLargePicturePopupWindow img  {           \
        margin:                 0;              \
        margin-bottom:          -4px;           \
        padding:                0;              \
    }                                           \
" );

¿3?)addJQuery()的特定版本可能并不总是有效(竞争条件)。如果没有,请告诉我。