Comment utiliser jQuery dans les scripts Greasemonkey dans Google Chrome?

comme certains d'entre vous le savent peut-être, GoogleChrome a fortement limité les scripts Greasemonkey.

Chrome ne supporte pas @require , @resource , unsafeWindow , GM_registerMenuCommand , GM_setValue , ou GM_getValue .

sans exiger, Je ne peux pas trouver un moyen d'inclure la bibliothèque jQuery dans Greasemonkey script sous Google Chrome.

quelqu'un at-il des conseils à ce sujet?

151
demandé sur Brock Adams 2010-02-11 21:57:15

11 réponses

à Partir de "Script Utilisateur Astuce: à l'Aide de jQuery - Erik Vold Blog"

// ==UserScript==
// @name         jQuery For Chrome (A Cross Browser Example)
// @namespace    jQueryForChromeExample
// @include      *
// @author       Erik Vergobbi Vold & Tyler G. Hicks-Wright
// @description  This userscript is meant to be an example on how to use jQuery in a userscript on Google Chrome.
// ==/UserScript==

// a function that loads jQuery and calls a callback function when jQuery has finished loading
function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "window.jQ=jQuery.noConflict(true);(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

// the guts of this userscript
function main() {
  // Note, jQ replaces $ to avoid conflicts.
  alert("There are " + jQ('a').length + " links on this page.");
}

// load jQuery and execute the main function
addJQuery(main);
188
répondu tghw 2016-02-28 23:11:32

j'ai écrit quelques fonctions basées sur le script D'Erik Vold pour m'aider à exécuter des fonctions, du code et d'Autres scripts dans un document. Vous pouvez les utiliser pour charger jQuery dans la page et ensuite lancer le code sous la portée globale window .

Exemple D'Usage

// ==UserScript==
// @name           Example from http://stackoverflow.com/q/6834930
// @version        1.3
// @namespace      http://stackoverflow.com/q/6834930
// @description    An example, adding a border to a post on Stack Overflow.
// @include        http://stackoverflow.com/questions/2246901/*
// ==/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-6834930").css("border", ".5em solid black");
});

Vous pouvez cliquez ici pour l'installer, si vous avez confiance que je ne suis pas en train de vous tromper dans l'installation de quelque chose malveillant et que personne n'a édité mon post pour pointer vers quelque chose d'autre. Rechargez la page et vous devriez voir une frontière autour de mon poste.

fonctions

load(url, onLoad, onError)

charge le script à url dans le document. Optionnellement, des callbacks peuvent être fournis pour onLoad et onError .

execute(functionOrCode)

Insère une fonction ou une chaîne de code dans le document et l'exécute. Les fonctions sont converties en code source avant d'être insérées, de sorte qu'elles perdent leur portée/fermeture actuelle et sont exécutées sous la portée globale window .

loadAndExecute(url, functionOrCode)

un raccourci; cela charge un script de url , puis insère et exécute functionOrCode si réussi.

Code

function load(url, onLoad, onError) {
    e = document.createElement("script");
    e.setAttribute("src", url);

    if (onLoad != null) { e.addEventListener("load", onLoad); }
    if (onError != null) { e.addEventListener("error", onError); }

    document.body.appendChild(e);

    return e;
}

function execute(functionOrCode) {
    if (typeof functionOrCode === "function") {
        code = "(" + functionOrCode + ")();";
    } else {
        code = functionOrCode;
    }

    e = document.createElement("script");
    e.textContent = code;

    document.body.appendChild(e);

    return e;
}

function loadAndExecute(url, functionOrCode) {
    load(url, function() { execute(functionOrCode); });
}
43
répondu Jeremy Banks 2012-10-14 13:54:57

Utiliser jQuery sans peur des conflits , en appelant jQuery.noConflict(true) . Comme ceci:

function GM_main ($) {
    alert ('jQuery is installed with no conflicts! The version is: ' + $.fn.jquery);
}

add_jQuery (GM_main, "1.7.2");

function add_jQuery (callbackFn, jqVersion) {
    jqVersion       = jqVersion || "1.7.2";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'http://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}


mais, pour les scripts de cross-browser, pourquoi ne pas profiter d'une copie locale rapide de jQuery, quand vous le pouvez?

fonctionne comme un Chrome userscript et un Greasemonkey script, et il utilise la copie locale de nice @require de jQuery, si la plate-forme prend en charge.

// ==UserScript==
// @name     _Smart, cross-browser jquery-using script
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant    GM_info
// ==/UserScript==

function GM_main ($) {
    alert ('jQuery is installed with no conflicts! The version is: ' + $.fn.jquery);
}

if (typeof jQuery === "function") {
    console.log ("Running with local copy of jQuery!");
    GM_main (jQuery);
}
else {
    console.log ("fetching jQuery from some 3rd-party server.");
    add_jQuery (GM_main, "1.7.2");
}

function add_jQuery (callbackFn, jqVersion) {
    var jqVersion   = jqVersion || "1.7.2";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'http://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}
16
répondu Brock Adams 2013-01-31 23:20:36

si la page a déjà jQuery, alors il suffit de suivre ce modèle:

// ==UserScript==
// @name          My Script
// @namespace     my-script
// @description   Blah
// @version       1.0
// @include       http://site.com/*
// @author        Me
// ==/UserScript==

var main = function () {

    // use $ or jQuery here, however the page is using it

};

// Inject our main script
var script = document.createElement('script');
script.type = "text/javascript";
script.textContent = '(' + main.toString() + ')();';
document.body.appendChild(script);
15
répondu Mottie 2012-02-23 09:15:21

la manière simple est d'utiliser required mot clé:

// @require     http://code.jquery.com/jquery-latest.js
7
répondu Stiger 2014-07-28 02:25:13

il y a un moyen vraiment facile de se déplacer, y compris une copie complète de jQuery pour les scripts Chrome quand ces scripts n'utilisent pas réellement de fonctionnalités privilégiées (fonctions GM_*, etc)...

insérez simplement le script lui-même dans le DOM de la page et exécutez! La meilleure partie est que cette technique fonctionne tout aussi bien sur Firefox+Greasemonkey, de sorte que vous pouvez utiliser le même script pour les deux:

var script = document.createElement("script");
script.type = "text/javascript";
script.textContent = "(" + threadComments.toString() + ")(jQuery)";
document.body.appendChild(script);

function threadComments($) {
    // taken from kip's http://userscripts-mirror.org/scripts/review/62163
    var goodletters = Array('\u00c0','\u00c1','\u00c2','\u00c3','\u00c4','\u00c5','\u00c6','\u00c7'
                             ,'\u00c8','\u00c9','\u00ca','\u00cb','\u00cc','\u00cd','\u00ce','\u00cf'
                                      ,'\u00d1','\u00d2','\u00d3','\u00d4','\u00d5','\u00d6'         
                             ,'\u00d8','\u00d9','\u00da','\u00db','\u00dc','\u00dd'                  
                             ,'\u00e0','\u00e1','\u00e2','\u00e3','\u00e4','\u00e5','\u00e6','\u00e7'
                             ,'\u00e8','\u00e9','\u00ea','\u00eb','\u00ec','\u00ed','\u00ee','\u00ef'
                                      ,'\u00f1','\u00f2','\u00f3','\u00f4','\u00f5','\u00f6'         
                             ,'\u00f8','\u00f9','\u00fa','\u00fb','\u00fc','\u00fd'         ,'\u00ff').join('');

    // from Benjamin Dumke's http://userscripts-mirror.org/scripts/review/68252
    function goodify(s)
      {
         good = new RegExp("^[" + goodletters + "\w]{3}");
         bad = new RegExp("[^" + goodletters + "\w]");
         original = s;
         while (s.length >3 && !s.match(good)) {
            s = s.replace(bad, "");
            }
         if (!s.match(good))
         {
           // failed, so we might as well use the original
           s = original;
         }
         return s;
      }  

    in_reply_to = {};


    function who(c, other_way) {


        if (other_way)
        {
            // this is closer to the real @-reply heuristics
            m = /@(\S+)/.exec(c);
        }
        else
        {
            m = /@([^ .:!?,()[\]{}]+)/.exec(c);
        }
        if (!m) {return}
        if (other_way) {return goodify(m[1]).toLowerCase().slice(0,3);}
        else {return m[1].toLowerCase().slice(0,3);}
    }

    function matcher(user, other_way) {
        if (other_way)
        {
            return function () {
                return goodify($(this).find(".comment-user").text()).toLowerCase().slice(0,3) == user
                }
        }
        else
        {
            return function () {
                return $(this).find(".comment-user").text().toLowerCase().slice(0,3) == user
                }
        }
    }

    function replyfilter(id) {
        return function() {
            return in_reply_to[$(this).attr("id")] == id;
        }
    }

    function find_reference() {
        comment_text = $(this).find(".comment-text").text();
        if (who(comment_text))
        {
            fil = matcher(who(comment_text));
            all = $(this).prevAll("tr.comment").filter(fil);
            if (all.length == 0)
            {
                // no name matched, let's try harder
                fil = matcher(who(comment_text, true), true);
                all = $(this).prevAll("tr.comment").filter(fil);
                if (all.length == 0) {return}
            }
            reference_id = all.eq(0).attr("id");
            in_reply_to[$(this).attr("id")] = reference_id;
        }
    }


    // How far may comments be indented?
    // Note that MAX_NESTING = 3 means there are
    // up to *four* levels (including top-level)
    MAX_NESTING = 3

    // How many pixels of indentation per level?
    INDENT = 30

    function indenter(parent) {

        for (var i = MAX_NESTING; i > 0; i--)
        {
            if (parent.hasClass("threading-" + (i-1)) || (i == MAX_NESTING && parent.hasClass("threading-" + i)))
            {
                return function() {
                    $(this).addClass("threading-" + i).find(".comment-text").css({"padding-left": INDENT*i});
                }
            }
        }

        return function() {
            $(this).addClass("threading-1").find(".comment-text").css({"padding-left": INDENT});
        }

    }

    function do_threading(){
        id = $(this).attr("id");
        replies = $(this).nextAll("tr.comment").filter(replyfilter(id));
        ind = indenter($(this));
        replies.each(ind);
        replies.insertAfter(this);
    }

    function go() {
        $("tr.comment").each(find_reference);
        $("tr.comment").each(do_threading);
    }

    $.ajaxSetup({complete: go});
    go();
}

(volé sans autorisation) de Shog9 sur meta.stackoverflow puisqu'il ne l'a pas déplacé ici, et je dois supprimer le meta post..)

6
répondu Jeff Atwood 2016-03-18 22:56:52

vous pouvez aussi empaqueter votre script avec jQuery to Chrome extension. Voir GoogleChrome Content Scripts .

les extensions Chrome, contrairement aux scripts Greasemonkey, peuvent se mettre à jour automatiquement.

4
répondu NVI 2010-02-16 16:23:46

solution plus facile: couper+coller le contenu de jquery.min.js dans le haut de votre script utilisateur. Faire.

j'ai trouvé divers problèmes avec les réponses recommandées. La solution addJQuery () fonctionne sur la plupart des pages mais a des bugs sur beaucoup. Si vous rencontrez des problèmes, copiez+collez le contenu de jquery dans votre script.

4
répondu cyphunk 2012-10-04 09:41:42

je me demande si vous ne pouvez pas compter sur document.defaultView.jQuery dans votre script GM ala:

if (document.defaultView.jQuery) {
  jQueryLoaded(document.defaultView.jQuery);
} else {
  var jq = document.createElement('script');
  jq.src = 'http://jquery.com/src/jquery-latest.js';
  jq.type = 'text/javascript';
  document.getElementsByTagName('head')[0].appendChild(jq);
  (function() { 
    if (document.defaultView.jQuery) jQueryLoaded(document.defaultView.jQuery);
    else setTimeout(arguments.callee, 100);
  })();
}

function jQueryLoaded($) {
  console.dir($);
}
2
répondu gnarf 2010-07-22 10:04:55

une autre approche serait de modifier votre script pour charger jQuery manuellement. Exemple de http://joanpiedra.com/jquery/greasemonkey / :

// Add jQuery
var GM_JQ = document.createElement('script');
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(GM_JQ);

// Check if jQuery's loaded
function GM_wait() {
    if(typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(GM_wait,100); }
else { $ = unsafeWindow.jQuery; letsJQuery(); }
}
GM_wait();

// All your GM code must be inside this function
function letsJQuery() {
    alert($); // check if the dollar (jquery) function works
}

EDIT: DRATS! après les tests, il semble que ce code ne fonctionne pas puisque Google Chrome exécute userscripts/extensions dans un champ d'application/processus séparé de la page Web réelle. Vous pouvez télécharger le code jQuery en utilisant une XmlhttpRequest et ensuite L'évaluer, mais vous devez héberger le code sur un serveur qui autorise Cross-Origin Resource Sharing en utilisant l'en-tête Access-Control-Allow-Origin: * . Malheureusement aucun des CDNs actuels avec jQuery supporte ceci.

1
répondu Greg Bray 2017-05-23 12:26:00

extension parfaite pour intégrer jQuery dans la Console Chrome aussi simple que vous pouvez l'imaginer. Cette extension indique également si jQuery a déjà été Embedded dans la page.

cette extension utilisée pour intégrer jQuery dans n'importe quelle page que vous voulez. Il permet d'utiliser jQuery dans le shell de la console (vous pouvez invoquer la console Chrome par "Ctrl+Shift+j").

pour intégrer jQuery dans l'onglet sélectionné cliquez sur le bouton extension.

lien vers l'extension: https://chrome.google.com/extensions/detail/gbmifchmngifmadobkcpijhhldeeelkc

-1
répondu Andrey 2010-07-22 09:47:45