jQuery实现跨域iframe接口方法调用
cross.js
(function(global){ global.Cross={ signalHandler:{}, on:function(signal,func){ this.signalHandler[signal]=func; }, call:function(win,domain,signal,data,callbackfunc){ varnotice={"signal":signal,"data":data}; if(!!callbackfunc){ notice["callback"]="callback_"+newDate().getTime(); Cross.on(notice["callback"],callbackfunc); } varnoticeStr=JSON.stringify(notice); win.postMessage(noticeStr,domain); } }; $(window).on("message",function(e){ varrealEvent=e.originalEvent, data=realEvent.data, swin=realEvent.source, origin=realEvent.origin, protocol; try{ protocol=JSON.parse(data); varresult=global.Cross.signalHandler[protocol.signal].call(null,protocol.data); if(!!protocol["callback"]){ Cross.call(swin,origin,protocol["callback"],{result:result}); } if(/^callback_/.test(protocol.signal)){ deleteCross.signalHandler[protocol.signal]; } }catch(e){ console.log(e); thrownewError("crosserror."); } }); })(window);
a.html
<!doctypeHTML> <html> <head> <scriptsrc="jquery-1.8.3.min.js"></script> <scriptsrc="cross.js"></script> <script> functioncall_b(){ varifw=$("#ifr")[0].contentWindow; //调用iframe子页面的公开的test接口,子页面域名为http://localhost:8088 Cross.call(ifw,"http://localhost:8088","test",{t:$("#txt").val()}); } </script> </head> <body> <inputid="txt"type="text"/> <buttononclick="call_b()">call</button> <iframeid="ifr"src="http://localhost:8088/b.html"></iframe> </body> </html>
b.html
<!doctypeHTML> <html> <head> <scriptsrc="jquery-1.8.3.min.js"></script> <scriptsrc="cross.js"></script> <script> //对外公开一个接口命名为test Cross.on("test",function(data){ alert(data.t); }); </script> </head> <body> </body> </html>
以上就是本文所述的iframe跨域的解决方案了,希望大家能够喜欢。