Может ли скрипт greasemonkey узнать, что загружено в другую вкладку?

Я планирую написать сценарий 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 ответ

Greasemonkey не может:

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

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


Greasemonkey может:

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

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

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

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

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