Javascript 如何在运行相同GreaseMonkey用户脚本的两个选项卡之间传递信息?

Javascript 如何在运行相同GreaseMonkey用户脚本的两个选项卡之间传递信息?,javascript,local-storage,parameter-passing,greasemonkey,Javascript,Local Storage,Parameter Passing,Greasemonkey,我已经编写了一个GreaseMonkey(javascript)用户脚本,它在浏览器(FireFox)选项卡中运行,指向www.site1.com/stuff。另一个选项卡指向www.site1.com(没有内容),并且不是第一个选项卡的子窗口(例如,未通过第一个选项卡上运行的用户脚本打开)。用户脚本(独立地)在两个选项卡上运行 我希望第一个浏览器选项卡上的userscript执行将字符串变量传递给第二个浏览器选项卡。虽然GM_setValue和GM_getValue对于单个用户脚本中的存储/检

我已经编写了一个GreaseMonkey(javascript)用户脚本,它在浏览器(FireFox)选项卡中运行,指向
www.site1.com/stuff
。另一个选项卡指向
www.site1.com
(没有
内容
),并且不是第一个选项卡的子窗口(例如,未通过第一个选项卡上运行的用户脚本打开)。用户脚本(独立地)在两个选项卡上运行

我希望第一个浏览器选项卡上的userscript执行将字符串变量传递给第二个浏览器选项卡。虽然
GM_setValue
GM_getValue
对于单个用户脚本中的存储/检索很好,但该存储区域似乎不可供其他用户脚本执行访问<代码>本地存储也会遇到同样的故障。举个明确的例子:

  • 当用户脚本检测到它正在
    www.site1.com/stuff
    上运行时,它将一个值放入存储器:
    GM_setValue('parValue','aaabbccc')

  • 在第一个选项卡完全加载并有足够的时间将此值放入存储器后,将手动打开第二个选项卡。当用户脚本检测到第二个选项卡正在
    www.site1.com
    上运行时(没有
    stuff
    ),代码将尝试检索值:
    var parVal=GM_getValue('parValue')
    。在我的userscript中,parVal将有一个
    null
    值;每个用户脚本执行似乎使用不同的存储区域

在以下约束条件下,如何实现这项看似简单的任务,即让同一用户脚本的两次执行都从公共存储区域安全/检索:
*用户可以随意更改第一个选项卡URL末尾的
stuff
(不可能为每种可能的
stuff
编写单独的用户脚本)。
*选项卡永远不会有父/子关系,因为它们是独立生成的(从技术上讲,第二个选项卡是第一个选项卡的孙子,但我不知道这两个选项卡的窗口名是什么,也不知道如何在代码中引用它们)。
*使用在GreaseMonkey用户脚本中运行的javascript


是否有某种全局的、跨选项卡的存储区域可以使用,并且可以在GreaseMonkey用户脚本中实现?理论上,
GM_setValue
是否适用于这种情况?我花了大量时间仔细研究了以下相关SO问题的答案,但未能找到适用于上述条件集和/或可在GreaseMonkey用户脚本中实现的解决方案:,

事实证明,“GM_setValue/getValue”确实允许在两个选项卡之间共享信息,其中相同的用户脚本并行运行。我用下面的测试代码证明了这一点。我从一个指向
www.google.com
的选项卡开始,得到了警报,然后在同一浏览器窗口中打开另一个选项卡,并将URL指向www.yahoo.com。该警报表示该值已从
google.com
上执行的userscript所放置的存储器中成功检索

// ==UserScript==
// @name        hello world
// @namespace   http://www.sharelatex.com
// @include     https://www.google.com/*
// @include     https://www.yahoo.com/*
// @grant       GM_setValue
// @grant       GM_getValue
// ==/UserScript==

if (window.location.href.indexOf("google.com") != -1) {  // on Google URL 
    alert("on Google site, storing value");
   // you will see the above alert verifying that code understands  
   // the code is running on the google.com tab
    GM_setValue('passValue', 'aabbcc'); 
} else { 
    alert("on Yahoo site, retrieving value");
   // the above alert will be seen, verifying that the code 
   // understands the code is running on the yahoo.com tab
    var pvalue = GM_getValue('passValue'); 
    alert("The retrieved value is " + pvalue);
   // the above alert should show aabbcc, verifying that the 
   // userscript running on google.com successfully stored the value 
  // and the script on yahoo.com successfully retrieved it. 
}

用户脚本的其他执行程序似乎无法访问该存储区域
-您错了。。。GM_setValue存储每个脚本的值,无论URL如何-相同的脚本、相同的存储
localStorage
工作,并在
窗口上提供
消息
事件,这是一个伟大的“IPC”解决方案感谢@JaromandaX。我只是在代码中没有看到预期的行为。我将制作一个精简的用户脚本,只测试这个功能,并在这里发布。我很可能错误地使用了
GM_setValue
GM_getValue
。谢谢@dandavis。对于我的特定应用程序,没有必要(我不认为)有一个消息事件,但感谢您的评论,因为我想知道
localStorage
gmu getValue/setValue
有何不同。谁知道呢,当我深入研究我的代码开发时,也许我会发现我确实需要
窗口上的
消息
事件。令我惊讶的是,我的精简用户脚本专注于“GM_setValue”功能,其工作原理与@JaromandaX所描述的一模一样。(我没有对
localStorage
)进行相同的测试。该测试已添加到上面重新编辑的问题中(以防对其他人有帮助)。