Подтвердить что ты не робот

Почему jQuery не работает в пользовательских сценариях Chrome (Greasemonkey)?

Возможный дубликат:
Как я могу использовать jQuery в сценариях Greasemonkey в Google Chrome?

Я не могу заставить этого пользователя script работать в 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!"); в script, он работает.

Как я могу использовать jQuery в пользовательских скриптах Chrome?

4b9b3361

Ответ 1

В документе для пользовательского проекта script для Chrome упоминаются следующие известные проблемы:

  • Хром не поддерживает @require, @resource, unsafeWindow, GM_registerMenuCommand, GM_setValue или GM_getValue.
  • GM_xmlhttpRequest только для одного и того же происхождения.

Это рассматривается в вопросе Включить JQuery внутри GreaseMonkey script в Google Chrome. Вот мой ответ из этого вопроса:


Я написал несколько функций, основанных на ответе script из Эрика Вольда, чтобы помочь мне запускать функции, код и другие скрипты в документе. Вы можете использовать их для загрузки 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)

Загружает script в url в документ. При желании могут быть предусмотрены обратные вызовы для onLoad и onError.

execute(functionOrCode)

Вставляет в документ функцию или строку кода и выполняет ее. Эти функции преобразуются в исходный код перед их вставкой, поэтому они теряют свою текущую область действия/закрытия и запускаются под глобальной областью window.

loadAndExecute(url, functionOrCode)

Ярлык; он загружает script из url, затем вставляет и выполняет functionOrCode в случае успеха.

код

Источник CoffeeScript

Я написал их в CoffeeScript (маленький язык, который компилируется на JavaScript). Вот источник CoffeeScript для использования вами, вы сами используете CofeeScript. Для пользователей 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)})};

Ответ 3

Поддержка Greasemonkey в Chrome не включает операторы запроса. Вам лучше создать extension, а не Greasemonkey script.

Это, или вы можете использовать API Google для загрузки jQuery.

Ответ 4

Простое решение (если вам это выгодно) было бы просто скопировать вложенную мини-версию jQuery в ваш greasemonkey script.

// ==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!");
});

Ответ 5

Просто создайте расширение Chrome, используя Содержимое Script. Это довольно просто:

manifest.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() на самом деле не требуется, поскольку файл манифеста уже указывает, что script должен быть "run at" : "document_end".

Кроме того, как вы увидите в документах, jquery.min.js и main.js должны быть включены в ту же папку, что и manifest.json

Ответ 6

Попробуйте использовать TamperMonkey.

Ваш script работал как есть для меня, и я сделал несколько других пользовательских скриптов, которые используют jQuery.