【问题标题】:Getting jQuery and GM_addStyle to work in a Chrome userscript based off of a working Greasemonkey script让 jQuery 和 GM_addStyle 在基于工作的 Greasemonkey 脚本的 Chrome 用户脚本中工作
【发布时间】:2011-12-24 11:21:19
【问题描述】:

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

我在这件事上遇到了这个solution。但是即使在我将它与绕过代码集成后,该脚本也无法在 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);

【问题讨论】:

  • &lt;&gt;&lt;![CDATA[ ... 构造在 Chrome 中不起作用。此外,jQuery 注入也不是最好的。如果有人没有打败我,我会在几个小时内发布更详细的答案。
  • 我也猜到了。谢谢你。 :)

标签: javascript google-chrome greasemonkey userscripts


【解决方案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() 的特定版本可能并不总是有效(竞争条件)。如果没有,请告诉我。

【讨论】:

  • 它现在在 Chrome 上运行良好。虽然不在 Firefox 上。不过没关系。我刚做了2个版本。非常感谢。圣诞快乐,新年快乐!
  • 顺便说一句,如果这种注入方法不是最佳实践,是否有更好的方法将第三方 JS 库集成到用户脚本?还是我应该为此提出一个单独的问题,以便对其他人也有帮助?
  • 节日快乐!如果正确进行了更改,那么脚本应该可以在 FF 和 Chrome 上运行,而无需 2 个版本。至于库加载,我更喜欢检查库变量是否在计时器内定义。有时,直到&lt;script&gt; 的加载事件触发后不久,库才会准备好。 (虽然我不认为 jQuery 就是这种情况。)
  • 那我再检查一下。顺便说一句,我不太清楚在 JavaScript 中使用计时器。你能给我一个很好的例子吗?谢谢。
  • 针对问题1:既然使用jQuery通过在页面中注入用户脚本,那么如何从回调函数内部调用GM_*函数?或者,如果这不可能,如何在 Chrome 的用户脚本中同时使用 jQuery GM_* 函数?
猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多