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

1899
Kevin Fegan

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

4
Brock Adams

Greasemonkey cannot:

  1. See other tabs.
  2. Check the URLs of other tabs.
  3. Check for DOM nodes/elements in other tabs.

The reason is that Greasemonkey, Tampermonkey, etc. do not expose these APIs to/for userscripts.
(Full-fledged browser extensions can do all of those things.)


Greasemonkey can:

  1. Cross communicate between script instances using GM_setValue()Doc and GM_getValue()Doc.
  2. Sometimes, you can also use .postMessage().   (Example)
    This will probably only work for you if you use window.open to create the new tab.
  3. Since you are on the same domain, you could also use localStorage or cookies to cross communicate.
  4. Finally, if the new tabs are opened from the master tab, you van communicate to the new tab via URL parameters (or the hash). See this userscript for an example of that. (Note how the SEMC links are handled.)

I'm not looking for someone to write this script for me, I feel I'm capable of writing the script if I knew how to do a few things. If a script that does all or most of this already exists then that would be great too.

All the bits and pieces have been addressed on Stack Overflow, but not in any one question that I recall.

If you use variables to communicate (methods 1 or 3), be sure to have something like a beforeunload event handler to clear the variables before the master page closes.