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

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

  •  
  •   byzod Oct 5, 2022 1554 views
    This topic created in 1314 days ago, the information mentioned may be changed or developed.

    自己在写油猴脚本时,遇到需要在网页 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 replies    2022-10-06 14:05:38 +08:00
    Rache1
        1
    Rache1  
       Oct 5, 2022
    同一个脚本,跨域跨标签跨窗口可以用 GM_setValue 然后配合 GM_addValueChangeListener 实现通信。
    byzod
        2
    byzod  
    OP
       Oct 6, 2022
    @Rache1 原来 gm 也有事件订阅,学到了
    About     Help     Advertise     Blog     API     FAQ     Solana     959 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 21:17 PVG 05:17 LAX 14:17 JFK 17:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86