JavaScript(油猴脚本)中跨域通讯能用一个异步函数搞定吗?

2022-10-05 10:19:38 +08:00
 byzod

自己在写油猴脚本时,遇到需要在网页 A 唤起网页 B 做一些事并返回结果的需求(具体来说是偷懒不处理 api 问题,直接打开百度之类的网页获取搜索结果)

由于网页 A 和 B 不同域,B.document.onload 禁止访问,于是目前的流程是

问题在于第一次监听 ready 事件时,channel 还没有打开,只能通过 window.addEventListener 监听,而这玩意又是无返回值的函数,于是为了在异步主函数中不要跳出去整 callback ,使用的是如下方法

// 唤起 B

// 监听并等待 ready 消息, TODO: 增加 timeout
await new Promise(res=>{
  window.addEventListener("message", receiveMessage, false);
  async function receiveMessage(event)
  {
    // 收到 ready 消息
    if (event.origin === targetOrigin && event.data === 'openedReady') {
      res();
    }
  }
})

// 建立 messagechannel

只能说,看起来好 jb 怪

这是正确的操作吗……?

1000 次点击
所在节点    问与答
2 条回复
Rache1
2022-10-05 11:16:42 +08:00
同一个脚本,跨域跨标签跨窗口可以用 GM_setValue 然后配合 GM_addValueChangeListener 实现通信。
byzod
2022-10-06 14:05:38 +08:00
@Rache1 原来 gm 也有事件订阅,学到了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX