润滑脂猴子脚本可以知道加载到另一个选项卡中的内容吗?

Kev*_*gan 1 firefox script greasemonkey browser-tabs

我打算编写一个将在特定 URL(@include 或 @match)上运行的 Greasemonkey 脚本,但是,我想要它,以便如果我打开一个或多个具有相同 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. 管理“本地(计算机)存储”或管理“交叉表全局变量”(如果这甚至可以做到的话)。

Bro*_*ams 5

Greasemonkey 不能:

  1. 查看其他选项卡。
  2. 检查其他选项卡的 URL。
  3. 检查其他选项卡中的 DOM 节点/元素。

原因是 Greasemonkey、Tampermonkey 等不会向/为用户脚本公开这些 API。
(成熟的浏览器扩展 可以做所有这些事情。)


Greasemonkey 可以:

  1. 使用GM_setValue()DocGM_getValue()Doc在脚本实例之间进行交叉通信。
  2. 有时,您也可以使用.postMessage(). (示例
    可能仅适用于您window.open用于创建新选项卡的情况。
  3. 由于您在同一个域中,您还可以使用localStorage或 cookie 进行交叉通信。
  4. 最后,如果主选项卡打开新选项卡,您可以通过 URL 参数(或哈希)与新选项卡通信。有关示例,请参阅此用户脚本。(注意 SEMC 链接的处理方式。)

我不是在找人为我写这个剧本,我觉得如果我知道如何做一些事情,我就有能力写这个剧本。如果已经存在完成所有或大部分任务的脚本,那也很棒。

Stack Overflow 上已经解决了所有的点点滴滴,但在我记得的任何一个问题中都没有解决。

如果您使用变量进行通信(方法 1 或 3),请确保使用beforeunload事件处理程序之类的东西在母版页关闭之前清除变量。