17

可能重复:
如何在 Google Chrome 的 Greasemonkey 脚本中使用 jQuery?

我无法让此用户脚本在 Google Chrome 中运行。

// ==UserScript==
// @name           voip
// @namespace      1
// @description    voip
// @include        *
// @require        http://jquery.com/src/jquery-latest.js
// ==/UserScript==

$(document).ready(function() {  
        alert("Hello world!");
});

警报不显示。如果我只是alert("Hello world!");输入脚本,它就可以工作。

如何在 Chrome 用户脚本中使用 jQuery?

4

6 回答 6

32

Chrome 用户脚本实现的设计文档提到了这些已知问题:

  • Chromium 不支持@require, @resource, unsafeWindow, GM_registerMenuCommand, GM_setValue, 或GM_getValue.
  • GM_xmlhttpRequest只是同源。

这在问题Include Jquery inside GreaseMonkey script under Google Chrome中得到了解决。这是我对该问题的回答


我已经根据Erik Vold 回答中的脚本编写了一些函数,以帮助我在文档中运行函数、代码和其他脚本。您可以使用它们将 jQuery 加载到页面中,然后在全局window范围内运行代码。

示例用法

// ==UserScript==
// @name           Example from https://stackoverflow.com/q/6825715
// @version        1.2
// @namespace      https://stackoverflow.com/q/6825715
// @description    An example, adding a border to a post on Stack Overflow.
// @include        https://stackoverflow.com/questions/2588513/*
// ==/UserScript==

var load,execute,loadAndExecute;load=function(a,b,c){var d;d=document.createElement("script"),d.setAttribute("src",a),b!=null&&d.addEventListener("load",b),c!=null&&d.addEventListener("error",c),document.body.appendChild(d);return d},execute=function(a){var b,c;typeof a=="function"?b="("+a+")();":b=a,c=document.createElement("script"),c.textContent=b,document.body.appendChild(c);return c},loadAndExecute=function(a,b){return load(a,function(){return execute(b)})};

loadAndExecute("//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js", function() {
    $("#answer-6825715").css("border", ".5em solid black");
});

如果您相信我没有试图欺骗您安装恶意软件,并且没有人编辑我的帖子以指向其他内容,您可以单击此处安装它。重新加载页面,您应该会在我的帖子周围看到一个边框。

功能

load(url, onLoad, onError)

将脚本加载url到文档中。可选地,可以为onLoad和提供回调onError

execute(functionOrCode)

将函数或代码字符串插入文档并执行它。这些函数在插入之前会转换为源代码,因此它们会丢失当前的作用域/闭包并在全局window作用域下运行。

loadAndExecute(url, functionOrCode)

一条捷径;这会从 加载脚本,如果成功url则插入并执行。functionOrCode

代码

源 CoffeeScript

我用 CoffeeScript(一种编译成 JavaScript 的小语言)写了这些。这是供您自己使用 CofeeScript 的 CoffeeScript 源。对于 JavaScript 用户,编译和缩小的代码包含在下面。

load = (url, onLoad, onError) ->
    e = document.createElement "script"
    e.setAttribute "src", url

    if onLoad? then e.addEventListener "load", onLoad
    if onError? then e.addEventListener "error", onError

    document.body.appendChild e

    return e

execute = (functionOrCode) ->
    if typeof functionOrCode is "function"
        code = "(#{functionOrCode})();"
    else
        code = functionOrCode

    e = document.createElement "script"
    e.textContent = code

    document.body.appendChild e

    return e

loadAndExecute = (url, functionOrCode) ->
    load url, -> execute functionOrCode

编译和缩小的 JavaScript(468 个字符)

var load,execute,loadAndExecute;load=function(a,b,c){var d;d=document.createElement("script"),d.setAttribute("src",a),b!=null&&d.addEventListener("load",b),c!=null&&d.addEventListener("error",c),document.body.appendChild(d);return d},execute=function(a){var b,c;typeof a=="function"?b="("+a+")();":b=a,c=document.createElement("script"),c.textContent=b,document.body.appendChild(c);return c},loadAndExecute=function(a,b){return load(a,function(){return execute(b)})};
于 2011-07-26T05:38:50.403 回答
10

这是一篇不错的文章:How to play nice with jQuery and Greasemonkey

解释的方法也适用于 chrome。

更新:

我想出了一种适用于所有浏览器的更好方法,您可以在此处阅读

于 2010-04-11T06:17:54.423 回答
3

简单的解决方案(如果对您可行)就是将缩小版的 jQuery 复制粘贴到您的greasemonkey 脚本中。

// ==UserScript==
// @name           voip
// @namespace      1
// @description    voip
// @include        *
// ==/UserScript==
//jQuery 1.4.2 minified code
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll...
....
A.jQuery=A.$=c})(window);
//your code
$(document).ready(function() {  
    alert("Hello world!");
});
于 2010-04-06T22:40:41.177 回答
3

Chrome 中的 Greasemonkey 支持不包括 require 语句。您最好创建一个扩展而不是 Greasemonkey 脚本。

那,或者您可以使用 Google API 来加载 jQuery。

于 2010-04-06T21:52:07.557 回答
2

只需使用Content Script创建一个 Chrome 扩展程序。这很简单:

清单.json

{
  "name": "Hello World",
  "version": "1.0",
  "description": "Greets the world",
  "content_scripts": [
    {
      "matches": ["*"],
      "css": ["main.css"],
      "js": ["jquery.min.js","main.js"],
      "run at":"document_end",
    }
  ]
}

main.js

$(document).ready(function(){
    alert('Hello World');
});

值得指出的是,在此示例中,实际上不需要将警报包装在 $(document).ready() 中,因为清单文件已经指定脚本应该是"run at" : "document_end".

此外,正如您将在文档中看到的那样,jquery.min.js 和 main.js 必须包含在与 manifest.json 相同的文件夹中

于 2011-09-02T22:27:36.567 回答
2

尝试使用TamperMonkey

您的脚本对我来说按原样工作,我制作了许多其他使用 jQuery 的用户脚本。

于 2011-09-07T15:25:10.020 回答