oilmonkey 脚本能知道什么内容已加载到另一个选项卡吗?

oilmonkey 脚本能知道什么内容已加载到另一个选项卡吗?

我计划编写一个可以在特定 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. 管理“本地(计算机)存储”或管理“跨表全局变量”(如果可以做到的话)。

答案1

Greasemonkey 不能:

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

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


Greasemonkey 可以:

  1. 使用以下方式在脚本实例之间进行交叉通信GM_setValue()文件GM_getValue()文件
  2. 有时你也可以使用.postMessage()。 (例子
    这会大概window.open仅当您使用创建新选项卡时才适合您。
  3. 由于你们在同一个域上,因此您也可以使用localStorage或 cookie 进行交叉通信。
  4. 最后,如果打开了新标签页主选项卡,您可以通过 URL 参数(或哈希)与新选项卡进行通信。请参阅这个用户脚本举个例子。(请注意 SEMC 链接的处理方式。)

我并不是想找人帮我写这个剧本,我觉得只要我知道如何做几件事,我就能写出这个剧本。如果已经有一个可以完成所有或大部分任务的剧本,那就太好了。

Stack Overflow 上已对所有细节进行了解答,但是据我回忆,没有在任何一个问题中得到解答。

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

相关内容