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

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

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


person Gary    schedule 27.08.2012    source источник
comment
Что бы я ввел в директиву @grant? Разве это не работает только для Greasemonkey API? Как мне заставить @require <jQuery> работать в песочнице?   -  person Gary    schedule 28.08.2012
comment
Просто используйте @grant GM_getValue, это должно помочь. Даже если вы на самом деле не вызываете GM_getValue(), директива @grant имеет побочный эффект восстановления песочницы; так что @require должен вернуться к нормальной работе.   -  person Brock Adams    schedule 28.08.2012
comment
Ах да, я подумал, что это один из вариантов. Просто обходной путь, но, по крайней мере, это вариант. Я все еще буду придерживаться 0.9, потому что у меня слишком много скриптов, которые нужно изменить, и я бы предпочел оставить их без изменений, пока GS не решит эту проблему.   -  person Gary    schedule 28.08.2012
comment
Что ж, теперь я получаю запросы в поддержку от нескольких пользователей моих скриптов. Пожалуйста, отправьте отчет об ошибке разработчикам GM и/или прокомментируйте эта ошибка.   -  person Brock Adams    schedule 29.08.2012
comment
GS 1.0 был выпущен примерно 24 августа. Примерно с 27 августа они были завалены проблемами GS 1.0. Похоже, с этим наконец-то что-то сделают. Похоже, они также написали что-то об этом в блоге GS.   -  person Gary    schedule 29.08.2012
comment
На самом деле, запись в блоге и ошибка отчеты (пока) не помогают вообще. По сути, они говорят: «Перепишите все свои сценарии», но, в отличие от моего ответа выше, предлагают только один (плохой) вариант.   -  person Brock Adams    schedule 30.08.2012


Ответы (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.

person Brock Adams    schedule 04.09.2012

Прошло два года, а эта «функция» до сих пор недостаточно задокументирована или рассмотрена.

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

Возможные решения:

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

    var my_jquery = jQuery;

    jQuery.noConflict(true);

    var $ = my_jquery, jQuery = my_jquery;

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

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

person WackGet    schedule 28.05.2015

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

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

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

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

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

person RASG    schedule 21.09.2012