gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:00:23 25 4
gpt4 key购买 nike

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

我希望第一个浏览器选项卡上的用户脚本执行将字符串变量传递给第二个浏览器选项卡。虽然 GM_setValueGM_getValue 在单个用户脚本中可以很好地存储/检索,但其他用户脚本的执行似乎无法访问该存储区域。 localStorage 遭遇同样的失败。对于一个明确的例子:

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

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

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

是否有某种可以使用的全局交叉表存储区域,可以在 GreaseMonkey 用户脚本中实现?理论上,GM_setValue 是否应该适用于这种情况?我花了很多时间仔细研究以下相关 SO 问题的答案,但无法找到适用于上述条件集和/或可以实现到 GreaseMonkey 用户脚本中的解决方案: Communication between tabs or windows , Javascript: sharing data between tabs , https://superuser.com/questions/1005448/can-a-greasemonkey-script-know-whats-been-loaded-into-another-tab , Sending a message to all open windows/tabs using JavaScript ,

最佳答案

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

// ==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.
}

关于javascript - 如何在运行相同 GreaseMonkey 用户脚本的 2 个选项卡之间传递信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46783076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com