Как я могу использовать jQuery в Greasemonkey?

235

Я попытался поставить эту строку, но она не работает:

// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js

jQuery вообще не работает в Greasemonkey. Есть ли другой способ использовать jQuery в Greasemonkey?

-

Для всех людей, имеющих такую ​​же проблему, вы должны загрузить файл в greasespot, а затем установить его оттуда.

Опция Создать новый скрипт не будет работать!

Кира Найли
источник
14
@Jorge, разве ты не знал, что на этом веб-сайте нет абсолютно никакой магии? Вы можете перейти к чему угодно с расширением файла .user.js, и Greasemonkey спросит, хотите ли вы установить его. Это включает в себя файлы на вашем локальном компьютере. Установить любой скрипт так же просто, как перетащить его в браузер.
Роб Кеннеди
5
Похоже, что теперь он работает хорошо даже при редактировании файла после установки.
Йозеф Сабл
6
Джозеф прав - начиная с версии 0.9.0 , Greasemonkey теперь будет устанавливать @required файлы, как только файл будет отредактирован.
Рори О'Кейн
1
Также не забывайте все еще использовать $(document).ready(function() {...});в своем коде
User
1
Самый простой способ обновить вас @requires- это добавить хеш или строку запроса в конец @requireоператора и изменять его всякий раз, когда требуется обновление. Похоже на то, как вы «закашиваете» иконку. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js?v=changeme
Apache

Ответы:

190

Возможно, у вас недостаточно свежая версия Greasemonkey. Была добавлена ​​версия 0.8 @require.

// @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js 

Если у вас нет 0.8, используйте технику, описанную Джоан Пьедрой, для ручного добавления scriptэлемента на страницу .

Между версии 0.8 и 0.9, @requireбудет обработано только тогда , когда сценарий сначала установлен. Если вы измените список необходимых скриптов, вам нужно удалить скрипт и переустановить его; Greasemonkey загружает необходимый скрипт один раз при установке и затем использует кэшированную копию.

Начиная с 0.9, поведение Greasemonkey изменилось (для решения проблемы, связанной с тангенциальной связью ), так что теперь оно загружает необходимые скрипты после каждого редактирования; переустановка скрипта больше не нужна.

Роб Кеннеди
источник
Роб, так что мне нужно делать? Я создаю свои пользовательские скрипты, используя ссылку New User Script. Я добавил @require, и это не сработало. Так как я могу заставить это работать? Пожалуйста, объясните, что я хочу, чтобы метод @require работал, потому что он намного более элегантен, чем метод элемента script
Keira Nighly
1
Итак, я заставил это работать. Спасибо!!! Я загрузил скрипт в Greasespot и установил его оттуда.
Keira Nighly
2
Я представляю, что когда вы создаете новый скрипт из Greasemonkey, скрипт устанавливается сразу. Этот сценарий является пустым файлом по умолчанию, что означает, что вы упустили свой шанс потребовать какие-либо внешние сценарии.
Роб Кеннеди
То есть нет способа использовать @require для нового скрипта, который вы делаете? : /
квано
4
Это довольно просто, @Quano. Создайте новый файл .user.js, напишите в нем свой скрипт, а затем перетащите его в браузер, чтобы установить. Ограничение на требование внешних сценариев присутствует только в том случае, если вы создаете сценарий из пользовательского интерфейса Greasemonkey, но нет требования, что вы должны использовать Greasemonkey для создания файла сценария. Вы можете редактировать скрипт после его установки, но если вы хотите добавить новые @requireдирективы, вам нужно будет удалить и переустановить скрипт, чтобы он вступил в силу.
Роб Кеннеди
81

Если вы хотите использовать jQuery на сайте, где он уже включен, то это путь (вдохновленный BrunoLM):

var $ = unsafeWindow.jQuery;

Я знаю, что это не было первоначальной целью вопроса, но это становится все более распространенным случаем, и вы явно не исключали этот случай. ;)

Хенрик Хаймбюргер
источник
4
Очевидно, не поддерживается в Chrome - chromium.org/developers/design-documents/user-scripts
Эшли
Работает в скрипте Firefox!
Gqqnbig
2
Захочет проверить, что у вас его еще нет так: if(typeof $ == 'undefined'){ var $ = unsafeWindow.jQuery; } в Chrome сайты Jquery уже будут доступны.
Джонатон
Хм. Я получаю действительно странную ошибку при использовании этого. Это alert($('.submit_entry').length);и ошибка, и отправка соответствующего оповещения одновременно.
Джонатон
21

Нет ничего плохого в том, чтобы включить весь jQuery в ваш скрипт Greasemonkey. Просто возьмите исходный код и поместите его вверху вашего пользовательского скрипта. Не нужно создавать тег сценария, так как вы уже выполняете JavaScript!

В любом случае, пользователь загружает скрипт только один раз, поэтому размер скрипта не имеет большого значения. Кроме того, если вы когда-нибудь захотите, чтобы ваш скрипт Greasemonkey работал в не-GM средах (таких как пользовательские скрипты GM-esque от Opera или Greasekit в Safari), это поможет не использовать уникальные конструкции GM, такие как @require.

Дэн Лью
источник
7

Решение Роба правильное - используйте @require библиотеку jQuery и обязательно переустановите скрипт, чтобы директива была обработана.

Я думаю, что стоит добавить, что вы можете нормально использовать jQuery, как только вы включите его в свой скрипт, за исключением методов AJAX . По умолчанию jQuery ищет XMLHttpRequest, которого нет в контексте Greasemonkey. Я написал об обходном пути, где вы создаете оболочку для GM_xmlhttpRequest (версия XHR Greasemonkey) и используете jQuery ajaxSetup()для указания вашей обернутой версии в качестве значения по умолчанию. Как только вы это сделаете, вы можете использовать $.getи$.post как обычно.

У вас также могут быть проблемы с jQuery, $.getJSONпотому что он загружает JSONP с помощью <script>тегов. Это приводит к ошибкам, поскольку jQuery определяет функцию обратного вызова в области действия окна Greasemonkey, а загруженные сценарии ищут функцию обратного вызова в области действия основного окна. Лучше всего использовать $.getвместо этого и анализировать результат с JSON.parse().

Райан
источник
4

Вы можете создать новый скрипт с помощью New User Script в Greasemonkey, но вам нужно отредактировать файл config.xml в папке gm_scripts.

Ваш файл config.xml должен иметь такой же синтаксис, как этот:

<Script filename="jquery_test.user.js" name="jQuery Test" namespace="http://www.example.com/jQueryPlay/" description="Just a test" enabled="true" basedir="jquery_test">
        <Include>http://*</Include>
        <Require filename="jquery.js"/>
</Script>

Обратите внимание на <Require>тег.

В вашем скрипте вы можете использовать прямой синтаксис jQuery. Убедитесь, что в заголовке Greasemonkey есть тег require. Вот пример Hello World:

// ==UserScript==
// @name           Test jQuery
// @namespace      http://www.example.com/jQueryPlay/
// @description    Just a test
// @include        http://*
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.js
// ==/UserScript==

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

Помните, что после изменения config.xml вы должны перезапустить браузер для Greasemonkey, чтобы перезагрузить настройки снова.

Также обратите внимание, что вам нужно скопировать файл jquery.js в папку вашего скрипта, чтобы это работало. Я проверил это, и это работает, только если вы скопируете туда файл вручную.

Счастливого JQuerying!

Прорицание
источник
4

Обновление : как говорится в комментарии ниже, этот ответ устарел.

Как и все остальные, @require запускается только после установки скрипта. Однако вы также должны отметить, что в настоящее время jQuery 1.4. * Не работает с greasemonkey. Вы можете увидеть здесь для деталей: http://forum.jquery.com/topic/importing-jquery-1-4-1-into-greasemonkey-scripts-generates-an-error

Вам придется использовать jQuery 1.3.2, пока все не изменится.

Конли Оуэнс
источник
3
Этот ответ устарел с версии GM 0.9 или новее.
Брок Адамс
3
@ Брок: почему? Можете ли вы объяснить для нас нубов?
Тревор Салливан
2

мета @require не работает, если вы хотите отменить привязку событий на веб-странице с помощью jQuery, вам нужно использовать библиотеку jQuery, включенную в веб-страницу, а затем получить ее в Greasemonkey с помощью команды var $ = unsafeWindow.jQuery; Как отсоединить обработчики событий jquery в greasemonkey?

baptx
источник
1

Вы можете получить Component unavailable если импортируете скрипт jQuery напрямую.

Может быть, это то, о чем @Conley говорил ...

Ты можешь использовать

@require        http://userscripts.org/scripts/source/85365.user.js

которая является модифицированной версией для работы с Greasemonkey, а затем получить объект jQuery

var $ = unsafeWindow.jQuery;
$("div").css("display", "none");
BrunoLM
источник
Я понимаю, что это 5 лет, но мне просто интересно: не неправильно ли получить объект jQuery, как он уже был определен на странице, ссылаясь на unsafeWindow.jQuery?
JJ_
0

@requireэто НЕ обрабатывается только когда сценарий первый установлен! По моим наблюдениям это обрабатывается с первого раза исполнения! Таким образом, вы можете установить скрипт с помощью команды Greasemonkey для создания совершенно нового скрипта. Единственное, о чем вам нужно позаботиться, это то, что не происходит перезагрузки страницы, пока вы не добавили @requireдеталь. (и сохранить новый скрипт ...)

Dunstkreis
источник