JQuery в Greasemonkey 1.0 конфликтует с сайтами, использующими jQuery

С тех пор как новый Greasemonkey 1.0 был выпущен несколько дней назад, каждый сайт, в котором есть jQuery и где я использую jQuery в своем Greasemonkey script, не запускает мой script должным образом. JQuery, который у меня есть в моем GS script (с использованием метаданных @require), конфликтует со страницей jQuery. Это связано с новым @grant.

Я прочитал документацию, но до сих пор не знаю, как запустить GS-скрипты в песочнице; единственные варианты, похоже, либо предоставляют доступ к GS API, либо не предоставляют его никому, а запускают script без каких-либо ограничений безопасности, что для меня не работает, когда я разработал десятки сценариев GS для выполнения ограничений безопасности и т.д.

Ответ 1

Greasemonkey 1.0 радикально изменил способ работы песочницы, разрушив тысячи скриптов. Это огромная проблема, и я надеюсь, что вы присоединитесь ко мне, чтобы выразить свое мнение/опыт по основному отчету об ошибке для этой проблемы.

Блог Greasemonkey утверждает, что вы можете решить эту проблему следующим образом:

this.$ = this.jQuery = jQuery.noConflict(true);

... Который я не уверен, будет работать во всех случаях. И это точный неправильный подход от принципа устранения побочных эффектов, DRY-принципа, атомарного кодирования. На мой взгляд, лучшей стратегией является восстановление песочницы.

@grant песочницу, указав значение @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.

Ответ 2

Два года спустя, и эта "функция" до сих пор не была достаточно документирована или исправлена.

Скрипты, требующие jQuery, все еще конфликтуют с некоторыми страницами, использующими jQuery.

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

  • Добавьте @grant GM_log или аналогичную песочницу script
  • Псевдоним существующих объектов jQuery в script путем добавления этого блока:

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

  • Не используйте jQuery

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

Ответ 3

Имела ту же проблему.

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

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

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

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