发布订阅模式不属于23种设计模式,是从观察者模式中衍生出来的一种设计模式,由三部分组成:发布者,订阅者,还有中间的调度中心。
观察者模式由两部分组成:主体和观察者们,是1对多的关系
发布订阅模式由三部分组成:发布者,订阅者,还有中间的调度中心。
观察者模式的缺点是:
由此衍生出来的发布订阅模式,在两者中间增加了一个Event调度中心,来解决观察者上面的问题
自定义事件
import mitt from 'mitt'; const event = mitt(); event.on('test', () => { console.log('测试1'); }); event.on('test', () => { console.log('测试2'); }); event.on('test', () => { console.log('测试3'); }); event.emit('test');
iframe跨页面通信
parent.html
<body> <div id="parent">父容器</div> <iframe id="frame" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="./child.html"></iframe> </body> <script> // 父容器向子容器发送数据 const iframe = document.getElementById('frame').contentWindow; document.getElementById('parent').addEventListener('click', function(){ iframe.postMessage('我是父容器', '*') }) // 监听子容器发送过来的数据 window.addEventListener('message', function(event){ console.log(event.data) }) </script>
child.html
<body> <div id="child">子容器</div> </body> <script> // 子容器向父容器发送数据 document.getElementById('child').addEventListener('click', function(){ window.parent.postMessage('我是子容器', '*') }) // 监听父容器发送过来的数据 window.addEventListener('message', function(event){ console.log(event.data) }) </script>