1

Я планирую написать сценарий Greasemonkey, который будет запускаться по определенному URL-адресу (@include или @match), но мне бы хотелось, чтобы он открыв одну или несколько дополнительных вкладок с тем же URL-адресом, Скрипт Greasemonkey НЕ будет запускаться на вторых (и последующих) дублирующих страницах.

Так, например, скажем, у меня есть скрипт Greasemonkey, который вносит изменения "стиля" в веб-страницу (или каким-то другим образом "изменяет" ее), когда я открываю «google.com». Я хочу иметь возможность открыть еще одну вкладку "google.com", где этот сценарий Greasemonkey не будет запускаться. Или, более правильно, будет работать, но обнаружит, что он уже запущен и "модифицирует" страницу на первой вкладке, а затем "выйти" на второй вкладке. Вторая вкладка останется открытой, но сценарий "не затронет ее".

Я не знаю, может ли скрипт Greasemonkey "увидеть" другие открытые вкладки, но если это возможно, моей первой мыслью было проверить, была ли еще загружена другая вкладка на эту страницу, а затем выйти, если обнаружит, что это так.

Но это должно быть немного более сложным, потому что:

  1. Если первая вкладка была закрыта, и для этого URL была открыта новая ("третья") вкладка, я бы хотел, чтобы скрипт Greasemonkey запускался и "изменял" эту страницу, как это было бы на первой странице.
  2. Аналогично, если я "обновлю" первую вкладку (скажем, после редактирования скрипта Greasemonkey или по другой причине), я бы хотел, чтобы скрипт Greasemonkey запускался и "изменял" перезагруженную страницу.

Таким образом, кажется, что сценарий Greasemonkey должен либо:

  1. Проверьте URL каждой вкладки, чтобы найти "совпадение", а затем "Заглянуть на эту вкладку", чтобы увидеть, "сценарий" Greasemonkey "активно" изменяет эту страницу (возможно, искать скрытый, пустой, с именем "DIV" или другой элемент).
  2. Использовать какое-то "локальное хранилище" или «глобальный кросс-таб (суперглобальный?) переменные ", чтобы отслеживать вкладки, когда они открываются и закрываются.

Я не ищу кого-то, кто написал бы этот сценарий для меня, я чувствую, что способен написать сценарий, если бы я знал, как сделать несколько вещей. Если сценарий, который выполняет все или большую часть этого, уже существует, то это тоже было бы здорово.

Чтобы начать, мне нужно знать, если (и как) скрипт Greasemonkey:

  1. Можно "увидеть" другие вкладки.
  2. Можно прочитать URL-адреса (и, возможно, текст заголовка) других вкладок.
  3. Проверьте наличие (и, возможно, прочитанных, но не записанных) элементов на другой вкладке.
  4. Управление "локальным (компьютерным) хранилищем" или управление "глобальными переменными кросс-таблицы" (если это вообще возможно).

1 ответ1

5

Greasemonkey не может:

  1. Смотрите другие вкладки.
  2. Проверьте URL-адреса других вкладок.
  3. Проверьте наличие DOM-узлов / элементов на других вкладках.

Причина в том, что Greasemonkey, Tampermonkey и т.д. Не предоставляют эти API для пользовательских скриптов.
(Полноценные расширения браузера могут делать все эти вещи.)


Greasemonkey может:

  1. Перекрестное взаимодействие между экземплярами скрипта с использованием GM_setValue() Doc и GM_getValue() Doc.
  2. Иногда вы также можете использовать .postMessage().   (Пример)
    Это, вероятно, будет работать только для вас, если вы используете window.open для создания новой вкладки.
  3. Поскольку вы находитесь в одном домене, вы также можете использовать localStorage или файлы cookie для перекрестного общения.
  4. Наконец, если новые вкладки открываются из главной вкладки, вы можете общаться с новой вкладкой через параметры URL (или хэш). Посмотрите этот usercript для примера этого. (Обратите внимание, как обрабатываются ссылки SEMC.)

Я не ищу кого-то, кто написал бы этот сценарий для меня, я чувствую, что способен написать сценарий, если бы я знал, как сделать несколько вещей. Если сценарий, который выполняет все или большую часть этого, уже существует, то это тоже было бы здорово.

Все кусочки были рассмотрены в Переполнении стека, но не в одном вопросе, который я помню.

Если вы используете переменные для взаимодействия (методы 1 или 3), убедитесь, что у вас есть что-то вроде обработчика события beforeunload для очистки переменных перед закрытием главной страницы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .