class MessageCenter { constructor() { this.iframeMap = new Map(); this.messageCallbackMap = new Map(); // this.listen() } findIframeById(id) { let target = this.iframeMap.get(id); if (!target) { target = document.getElementById(id) this.iframeMap.set('id', target) } return target } send(id, actionType, data) { const target = this.findIframeById(id); target && target.contentWindow.postMessage({ actionType, data }, '*') } // don't use add(actionType, callback) { let activeQuene = this.messageCallbackMap.get(actionType); if (activeQuene?.length > 0) { activeQuene.push(callback) } else { this.messageCallbackMap.set(actionType, [callback]) } } // don't use listen() { window.addEventListener('message', (e) => { const { actionType, data } = e.data; console.log('get message in content ...', actionType, data) const quene = this.messageCallbackMap.get(actionType) || []; while (quene.length > 0) { let callback = quene.pop(); callback(data) } }) } } const messageCenter = new MessageCenter(); export default messageCenter;