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.

Потенциальные решения:

  1. добавлять @grant GM_log или похожий на песочницу скрипт
  2. Псевдоним существующих объектов jQuery в сценарии, добавив этот блок:

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

  3. Не используйте JQuery

В общем, ужасное решение от Greasemonkey.

Была такая же проблема.

Начиная с версии GM 1.0 все мои сценарии @require Перестал работать jQuery, работающий на сайтах, которые также используют jQuery.

Я знаю, я мог бы попробовать что-то вроде $ = unsafeWindow.$, но это не главное.

Дело в том, что раньше они работали, а теперь нет.

Добавление @grant GM_log исправил их.

Другие вопросы по тегам