最近作的几个软件项目,须要大量使用IFrame,IFrame与主窗体通讯的问题天然浮现。code
稍做研究,可知此问题的解决思路是这样的:事件
function trigger(name, payload){ $.event.trigger({ type: name, payload: payload }); }
调用示例:get
trigger('Event-B', {words: 'Hello! I\'m B.'});
function listen(name, callback){ function warn(warning){ console && console.warn && console.warn('listen:', warning); } $(document).on(name, function(event){ if(callback && callback.constructor === Function){ callback(event.payload); }else{ console.warn('callback should be a "Function" object'); } }); }
调用示例:iframe
listen('Event-A', function(payload){ console && console.log && console.log('Event-A receieved. The payload is ' + JSON.stringify(payload)); });
function triggerOnIFrame(iframe, name, payload){ function warn(warning){ console && console.warn && console.warn('triggerOnIFrame:', warning); } if(!name){ warn('"name" of the event is excepted.'); }else{ var $iframe = $(iframe); if($iframe.length>0){ $iframe.each(function(i, item){ item.contentWindow.$(item.contentWindow.document).trigger({ type: name, payload: payload }); }); }else{ warn('\'jQuery selector \'' + iframe + '\')\' not found in DOM.' ); } } }
调用示例:string
triggerOnIFrame('iframe#map', 'Event-A', {word: 'Hello! I\'m A.'});
function listenOnIFrame(iframe, name, callback){ function warn(warning){ console && console.warn && console.warn('listenOnIFrame:', warning); } var $iframe = $(iframe); if($iframe.length>0){ $iframe.each(function(i, item){ $(item).on('load', function(){ item.contentWindow.$(item.contentWindow.document).on(name, function(event){ if(callback && callback.constructor === Function){ callback(event.payload); }else{ warn('"callback" should be a "Function" object'); } }); }); }); }else{ warn('\'jQuery selector \'' + iframe + '\')\' not found in DOM.' ); } }
调用示例:it
listenOnIFrame('iframe#map', 'Event-B', function(payload){ console && console.log && console.log(payload); });
参考连接:io