Как да включа отдалечен javascript файл в скрипт на Greasemonkey?

Опитвам се да напиша скрипт Greasemonkey и бих искал да използвам библиотеката jQuery, за да го направя, но не съм съвсем сигурен как ще включа jQuery от уеб адрес, за да се движи.

Как да включа jQuery (от уеб сървъра на Google) в скрипта greasemonkey, така че да мога просто да отида:

$(document).ready(function(){
  // Greasemonkey stuff here
});

Бих предпочел да го взема от този източник:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript" charset="utf-8"></script>

Актуализация: Благодаря за помощта, отговорите бяха много информативни. Все пак използвах моя GoogleFu малко повече и попаднах на това решение: http://joanpiedra.com/jquery/greasemonkey/

Работи като чар... просто актуализирайте източника до хостваната от Google версия на jQuery, за да завършите.


person tester    schedule 22.04.2009    source източник
comment
Връзката не работи за мен, това направи: joanpiedra.com/portfolio/jquery-greasemonkey   -  person newenglander    schedule 20.06.2012


Отговори (4)


Препоръчителният начин в последните версии на greasemonkey е да използвате етикета за коментар @require.

E.g.

// ==UserScript==
// @name          Hello jQuery
// @namespace     http://www.example.com/
// @description   jQuery test script
// @include       *
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// ==/UserScript==

Въпреки това... имайте предвид, че jQuery 1.4.1 и 1.4.2 са несъвместими с този метод

Благодаря на Пол Тарян, че посочи това. Вижте нишката във форума на jQuery.

Също така имайте предвид тази семантика на @require

По времето, когато потребителският скрипт е инсталиран, Greasemonkey ще изтегли и запази локално кеширано копие на отдалечения файл, което може да бъде прочетено почти мигновено. Кешираното копие се съхранява в същата папка като вашия инсталиран потребителски скрипт. Отдалеченият файл не се следи за промени.

Моля, имайте предвид, че към момента на писане на този отговор този етикет @require се чете само по време на инсталиране. Ако редактирате съществуващ потребителски скрипт, за да добавите този етикет, той ще бъде игнориран. Трябва да деинсталирате и инсталирате отново вашия потребителски скрипт, за да вземете промяната.

person Cheekysoft    schedule 24.04.2009
comment
Уау, това е изключително просто решение. Това е страхотно, кешира също! Благодаря ти. - person tester; 25.04.2009
comment
страхотен, пълен и страхотен отговор. - person Dan Rosenstark; 11.12.2009
comment
Внимавайте, това не работи за 1.4.1 или 1.4.2: forum.jquery.com/topic/ - person Paul Tarjan; 12.04.2010
comment
Функцията за кеширане е страхотна и винаги я използвам в моите gs скриптове. Използвам jqueryjs.googlecode.com/files/jquery-1.2.6. pack.js тъй като е малък/опакован и през повечето време има това, от което се нуждая. - person fedmich; 10.08.2010
comment
@fdrv Опитайте да поставите низ за заявка в URL адреса, напр. добавете днешната дата. http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js?2018-10-08 - person Lee Kowalkowski; 08.10.2018
comment
Това не работи, ако се опитвате да използвате jsconsole.com, за да регистрирате конзолния изход на вашия потребителски скрипт, поне с Tampermonkey. Получавате грешка, че не може да се зареди @require от URL. - person John Smith; 28.07.2019

От тук:

// ==UserScript== 
// @name           jQueryTest 
// @namespace      http://www.example.com/
// @include        * 
// ==/UserScript== 

// 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 
    // the next call fails 
    $("<div id='example' class='flora' title='This is my title'>I'm in 
a dialog!</div>").dialog({ 
            buttons: { 
                "Ok": function() { 
                    alert("Ok"); 
                }, 
                "Cancel": function() { 
                    $(this).dialog("close"); 
                } 
            } 
        }); 
} 

Работи перфектно, но може да искате да ограничите сайтовете, на които работи, или да хоствате jQuery js файла на собствения си сайт, за да не откраднете тяхната честотна лента.

person Chris Doggett    schedule 23.04.2009
comment
хаха Радвам се, че току-що публикувахте и това. Току-що намерих тази връзка и замених GM_JQ.src = 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'; Благодарим ви за приноса!! - person tester; 23.04.2009
comment
Това не е необходимо за последните версии на greasemonkey и вместо това можете да използвате маркера @require. - person Cheekysoft; 11.12.2009
comment
Предимство от използването на този метод е, че трябва да работи в Chrome, където използването на @require няма да работи. - person Mike Buckbee; 03.04.2011
comment
не работи, ако имам нужда от скрипт за зареждане от http за https - person fdrv; 16.03.2016

Можете да опитате динамично създаване на елемент на скрипт:

var script = document.createElement("script");
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
document.getElementsByTagName("head")[0].appendChild(script);

Може да се наложи да забавите малко, докато скриптът се зареди (setTimeout?)

person Emmett    schedule 23.04.2009
comment
не работи, ако имам нужда от скрипт за зареждане от http за https - person fdrv; 16.03.2016

Въз основа на отговора на Крис се приспособявам към собствените си нужди като следното.

// ==UserScript==
// @description require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.jss
// @name         Baidu Mask
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://www.ibm.com/developerworks/cn/opensource/os-cn-greasemonkey/index.html
// @match        *://www.baidu.com/*
// @match        *://baike.baidu.com/*
// @match        *://zhidao.baidu.com/*
// @match        *://www.weather.com.cn/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...

    var $j;

    function GM_wait() {
        if (typeof jQuery === 'undefined') {
            window.setTimeout(GM_wait, 100);
        }
        else {
            $j = jQuery.noConflict();
            doJob();
        }
    }

    function loadJquery() {
        // Check if jQuery's loaded

        if (typeof jQuery === 'undefined') {
            // Add jQuery
            var GM_JQ = document.createElement('script');
            GM_JQ.src = 'https://code.jquery.com/jquery-1.12.4.min.js';
            GM_JQ.type = 'text/javascript';
            GM_JQ.id = 'jquery-lyz';
            document.getElementsByTagName('head')[0].appendChild(GM_JQ);
            GM_wait();
        } else {
            doJob();
        }
    }

    loadJquery();


    function doJob() {
        if (typeof $j === 'undefined') {
            $j = $;
        }

        var url_arr = [
            {'name': "baidu", 'value': "www.baidu.com"},
            {'name': "baike", 'value': "baike.baidu.com"},
            {'name': "zhidao", 'value': "zhidao.baidu.com"},
            {'name': "weather", 'value': "http://www.weather.com.cn"},
        ];
        var url = location.href;
        var siteObj = {};
        $j(url_arr).each(function (i, item) {
            if (url.indexOf(item.value) > -1) {
                siteObj = item;
                return false;
            }
        });

        var delay_arr = [];
        var timerCount = 1;

        function hideTimer() {
            timerCount++;
            if (timerCount > 20) {
                return;
            }
            delay_arr = $j.grep(delay_arr, function (_selector, i) {
                var $ele = $j(_selector);
                var visible = $ele.is(':visible');
                console.log($ele, visible);
                if (visible) {
                    $ele.hide();
                    return false;
                }


                return true; // keep the element in the array
            });
            if (delay_arr.length > 0) {
                setTimeout(hideTimer, 500);
            }
        }

        setTimeout(hideTimer, 500);
        var $frms;
        switch (siteObj.name) {
            case 'baidu':
                $j('#content_right').hide();
                break;
            case 'baike':
                $j('.topA, .lemmaWgt-promotion-slide, .union-content, .right-ad, .lemmaWgt-promotion-vbaike, .nav-menu').hide();
                delay_arr.push('#side_box_unionAd');
                break;
            case 'zhidao':
                $j('.widget-new-graphic, #union-asplu, .jump-top-box').hide();
                delay_arr.push('.wgt-daily');
                delay_arr.push('.shop-entrance');
                delay_arr.push('.cms-slide');
                delay_arr.push('.nav-menu');
                $frms = $j('iframe');
                $frms.hide();
                break;
            case 'weather':
                $j('.right, .hdImgs, .tq_zx, #di_tan, #zu_dui').hide();
                //delay_arr.push('.wgt-daily');
                $frms = $j('iframe');
                $frms.hide();
                break;
        }
    }

})();

Моят скрипт трябва да работи на различни сайтове, докато някои имат включен jquery, а други не, така че трябва да тествам. Начинът „изискване“ не работи тук.

person Leo Lee    schedule 26.01.2018