V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
byzod
V2EX  ›  问与答

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

  •  
  •   byzod · 2022-10-05 10:19:38 +08:00 · 1121 次点击
    这是一个创建于 765 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    • A 唤起 B
    • →B 检查是否有 parent 或 opener ,是则广播 ready 事件
    • →A 监听 ready 事件,建立 messagechannel
    • →B 监听发送 channel 的 message ,回应 messagechannel
    • →通过 messagechannel 通讯

    问题在于第一次监听 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 怪

    这是正确的操作吗……?

    2 条回复    2022-10-06 14:05:38 +08:00
    Rache1
        1
    Rache1  
       2022-10-05 11:16:42 +08:00
    同一个脚本,跨域跨标签跨窗口可以用 GM_setValue 然后配合 GM_addValueChangeListener 实现通信。
    byzod
        2
    byzod  
    OP
       2022-10-06 14:05:38 +08:00
    @Rache1 原来 gm 也有事件订阅,学到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2279 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:06 · PVG 00:06 · LAX 08:06 · JFK 11:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.