jQuery в Greasemonkey 1.0 конфликтует с веб-сайтами, использующими jQuery
С тех пор, как новая Greasemonkey 1.0 была выпущена несколько дней назад, на каждом сайте, где есть jQuery и где я использую jQuery в своем скрипте Greasemonkey, мой скрипт не запускается должным образом. JQuery, который я имею в моем скрипте GS (используя @require
метаданные) конфликтует с jQuery страницы. Это связано с новым @grant
код.
Я прочитал документацию, но все еще не знаю, как снова запустить скрипты GS в песочнице; единственные варианты, по-видимому, заключаются в том, чтобы либо предоставить доступ к GS API, либо предоставить его никому, и запустить сценарий без каких-либо ограничений безопасности, что совершенно не работает для меня, когда я разработал свои десятки сценариев GS для запуска С ограничениями безопасности и так нравится.
3 ответа
Greasemonkey 1.0 радикально изменил работу песочницы, уничтожив тысячи скриптов. Это огромная проблема, и я надеюсь, что вы присоединитесь ко мне и выскажете свое мнение / опыт по поводу основного сообщения об ошибке по этой проблеме.
Блог Greasemonkey утверждает, что вы можете обойти эту проблему следующим образом:
this.$ = this.jQuery = jQuery.noConflict(true);
... Что я не уверен, будет работать во всех случаях. И это совершенно неверный подход из принципа атомного кодирования, избегающего побочных эффектов, DRY-принципа. На мой взгляд, лучшая стратегия - восстановить песочницу.
Реактивировать песочницу, указав @grant
значение (кроме none
). Отредактируйте свой блок метаданных, чтобы он заканчивался следующими строками:
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
/*- The @grant directive is needed to work around a design flaws introduced in GM 1.0
and again in GM 4.0.
It restores the sandbox.
*/
Песочница будет восстановлена и все конфликты будут разрешены.
И сценарии будут совместимы с превосходными движками, такими как Tampermonkey и Violentmonkey.
Прошло два года, и эта "особенность" до сих пор недостаточно документирована и не решена.
Скрипты, для которых требуется jQuery, по-прежнему конфликтуют с некоторыми страницами, использующими jQuery.
Потенциальные решения:
- добавлять
@grant GM_log
или похожий на песочницу скрипт Псевдоним существующих объектов jQuery в сценарии, добавив этот блок:
var my_jquery = jQuery;
jQuery.noConflict(true);
var $ = my_jquery, jQuery = my_jquery;
Не используйте JQuery
В общем, ужасное решение от Greasemonkey.
Была такая же проблема.
Начиная с версии GM 1.0 все мои сценарии @require
Перестал работать jQuery, работающий на сайтах, которые также используют jQuery.
Я знаю, я мог бы попробовать что-то вроде $ = unsafeWindow.$
, но это не главное.
Дело в том, что раньше они работали, а теперь нет.
Добавление @grant GM_log
исправил их.