获取 2 个用户脚本来相互交互?
我有两个脚本。我将它们放在同一个命名空间中(@namespace
字段)。
我希望他们与另一个人互动。
具体来说,我希望脚本 A 将 RunByDefault 设置为 123。让脚本 B 检查是否为 RunByDefault==123然后让脚本A使用超时或任何东西来调用脚本B中的函数。
我该怎么做?我不想合并脚本。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
脚本之间无法直接交互,
// @namespace
只是为了解决脚本名称冲突。 (也就是说,您可以有 2 个名为“Link Remover”的不同脚本,前提是它们具有不同的命名空间。)单独的脚本可以使用以下方式交换信息:
localStorage
-- 仅在同域中工作就是这样。
同一脚本的不同运行实例可以使用
GM_setValue()
和GM_getValue()
交换信息。该技术具有跨域、简单、对目标网页不可见的优点。请参阅Tampermonkey 中跨选项卡通信的工作示例。
在 Chrome 上,并且仅在 Chrome 上,您可能能够使用非标准 文件系统 API 用于将数据存储在本地文件上。但这可能需要用户点击每笔交易——如果它有效的话。
另一种选择是编写一个扩展(附加组件)来充当助手并执行文件 IO。通常,您可以通过
postMessage
与它交互。在实践中,我从未遇到过这样的情况:合并真正需要共享数据的脚本不是更简单、更干净。
此外,脚本不能共享代码,但它们可以将 JS 注入到目标页面并且双方都访问该页面。
最后,AFAICT,脚本总是按顺序运行,而不是并行运行。但您可以从“管理用户脚本”面板控制执行顺序
The scripts cannot directly interact with each other and
// @namespace
is just to resolve script name conflicts. (That is, you can have 2 different scripts named "Link Remover", only if they have different namespaces.)Separate scripts can swap information using:
localStorage
-- works same-domain onlyThat's it.
Different running instances, of the same script, can swap information using
GM_setValue()
andGM_getValue()
. This technique has the advantage of being cross-domain, easy, and invisible to the target web page(s).See this working example of cross-tab communication in Tampermonkey.
On Chrome, and only Chrome, you might be able to use the non-standard FileSystem API to store data on a local file. But this would probably require the user to click for every transaction -- if it worked at all.
Another option is to write an extension (add-on) to act as a helper and do the file IO. You would interact with it via
postMessage
, usually.In practice, I've never encountered a situation were it wasn't easier and cleaner to just merge any scripts that really need to share data.
Also, scripts cannot share code, but they can inject JS into the target page and both access that.
Finally, AFAICT, scripts always run sequentially, not in parallel. But you can control the execution order from the Manage User Scripts panel