Как включить удаленный файл 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/

Работает как шарм .. просто обновите исходный код до версии jQuery, размещенной в Google, чтобы завершить.


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
Функция кеша великолепна, и я всегда использую ее в своих 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