自己在写油猴脚本时,遇到需要在网页 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 怪
这是正确的操作吗……?
