自己在写油猴脚本时,遇到需要在网页 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 怪
这是正确的操作吗……?
1
Rache1 2022-10-05 11:16:42 +08:00
同一个脚本,跨域跨标签跨窗口可以用 GM_setValue 然后配合 GM_addValueChangeListener 实现通信。
|