摘要:消息前綴建議使用自己的項(xiàng)目名避免多項(xiàng)目之間的沖突類(lèi)消息對(duì)象往發(fā)送消息出于安全考慮發(fā)送消息會(huì)帶上前綴以及現(xiàn)代瀏覽器支持兼容信使類(lèi)添加一個(gè)消息對(duì)象初始化消息監(jiān)聽(tīng)剝離消息前綴兼容監(jiān)聽(tīng)消息廣播消息用法頁(yè)面頁(yè)面跨域傳數(shù)據(jù)跨域傳高度
messengerjs
/** * __ ___ * / |/ /___ _____ _____ ___ ____ ____ _ ___ _____ * / /|_/ // _ / ___// ___// _ / __ / __ `// _ / ___/ * / / / // __/(__ )(__ )/ __// / / // /_/ // __// / * /_/ /_/ \___//____//____/ \___//_/ /_/ \__, / \___//_/ * /____/ * * @description MessengerJS, a common cross-document communicate solution. * @author biqing kwok * @version 2.0 * @license release under MIT license */ define(function (require) { // 消息前綴, 建議使用自己的項(xiàng)目名, 避免多項(xiàng)目之間的沖突 var prefix = "[PROJECT_NAME]", supportPostMessage = "postMessage" in window; // Target 類(lèi), 消息對(duì)象 function Target(target, name){ var errMsg = ""; if(arguments.length < 2){ errMsg = "target error - target and name are both requied"; } else if (typeof target != "object"){ errMsg = "target error - target itself must be window object"; } else if (typeof name != "string"){ errMsg = "target error - target name must be string type"; } if(errMsg){ throw new Error(errMsg); } this.target = target; this.name = name; } // 往 target 發(fā)送消息, 出于安全考慮, 發(fā)送消息會(huì)帶上前綴 if ( supportPostMessage ){ // IE8+ 以及現(xiàn)代瀏覽器支持 Target.prototype.send = function(msg){ this.target.postMessage(prefix + msg, "*"); }; } else { // 兼容IE 6/7 Target.prototype.send = function(msg){ var targetFunc = window.navigator[prefix + this.name]; if ( typeof targetFunc == "function" ) { targetFunc(prefix + msg, window); } else { throw new Error("target callback function is not defined"); } }; } // 信使類(lèi) function Messenger(name){ this.targets = {}; this.name = name; this.listenFunc = []; this.initListen(); } // 添加一個(gè)消息對(duì)象 Messenger.prototype.addTarget = function(target, name){ var targetObj = new Target(target, name); this.targets[name] = targetObj; }; // 初始化消息監(jiān)聽(tīng) Messenger.prototype.initListen = function(){ var self = this; var generalCallback = function(msg){ if(typeof msg == "object" && msg.data){ msg = msg.data; } // 剝離消息前綴 msg = msg.slice(prefix.length); for(var i = 0; i < self.listenFunc.length; i++){ self.listenFunc[i](msg); } }; if ( supportPostMessage ){ if ( "addEventListener" in document ) { window.addEventListener("message", generalCallback, false); } else if ( "attachEvent" in document ) { window.attachEvent("onmessage", generalCallback); } } else { // 兼容IE 6/7 window.navigator[prefix + this.name] = generalCallback; } }; // 監(jiān)聽(tīng)消息 Messenger.prototype.listen = function(callback){ this.listenFunc.push(callback); }; // 廣播消息 Messenger.prototype.send = function(msg){ var targets = this.targets, target; for(target in targets){ if(targets.hasOwnProperty(target)){ targets[target].send(msg); } } }; return Messenger; });用法 parent頁(yè)面
var messenger = new Messenger("parent"); var iframe = document.getElementById("iframepage"); messenger.addTarget(iframe.contentWindow, "iframe"); messenger.listen(function (msg) { var result = parseInt(msg, 10) + 20; if (result < mainWindowHeight) { result = mainWindowHeight; } $("#iframepage").height(result); });iframe 頁(yè)面
// iframe跨域傳數(shù)據(jù) var messenger = new Messenger("iframe"); messenger.addTarget(window.parent, "parent"); // 跨域傳main 高度 var height = $(".main").height(); messenger.targets["parent"].send(height); messenger.listen(function (msg) { });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85713.html
摘要:剛來(lái)公司時(shí)做得第一個(gè)項(xiàng)目是跨部門(mén)合作,使用了來(lái)做通信,十分簡(jiǎn)單,代碼不長(zhǎng),這里分析一下間通信的實(shí)現(xiàn)方式源碼消息前綴建議使用自己的項(xiàng)目名避免多項(xiàng)目之間的沖突注意消息前綴應(yīng)使用字符串類(lèi)型類(lèi)消息對(duì)象往發(fā)送消息出于安全考慮發(fā)送消息會(huì)帶上前綴 剛來(lái)公司時(shí)做得第一個(gè)項(xiàng)目是跨部門(mén)合作,使用了MessengerJS來(lái)做通信,十分簡(jiǎn)單,MessengerJS代碼不長(zhǎng),這里分析一下iframe間通信的實(shí)現(xiàn)...
摘要:小結(jié)小結(jié)本文主要是介紹了一個(gè)方案及其使用方法,來(lái)解決父窗體與子窗體的通信問(wèn)題。同時(shí)提供了一個(gè)完整的實(shí)例,可以實(shí)現(xiàn)子窗體向父窗體傳遞消息,父窗體通過(guò)監(jiān)聽(tīng)消息事件,來(lái)獲取子窗體消息的目的。歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 本文由前端林子發(fā)表于云+社區(qū)專(zhuān)欄 本文主要會(huì)介紹如何基于MessengerJS,實(shí)現(xiàn)iframe父窗體與子窗體間的通信,傳遞數(shù)據(jù)信息。同時(shí)本文會(huì)提...
摘要:開(kāi)發(fā)者需要在中設(shè)置屬性為跨域是的簡(jiǎn)稱(chēng)這是一種利用瀏覽器漏洞解決跨域的辦法腳本元素可以不受瀏覽器同源策略的限制。 什么是瀏覽器同源策略? 同源是指,域名,協(xié)議,端口號(hào)均相同,如圖: showImg(https://segmentfault.com/img/bV9rAO?w=1088&h=394); 注意:localhost和127.0.0.1雖然都指向本機(jī),但也是跨域. 瀏覽器同源策略(...
摘要:說(shuō)到跨域,就不得不提起瀏覽器的同源策略??缬驘o(wú)刷新提交跨域的方法有很多,像等等,由于項(xiàng)目中用到了進(jìn)行跨域,所以本文主要總結(jié)一下如何利用進(jìn)行無(wú)刷新提交。為了拿到返回回來(lái)的,需要使用一個(gè)函數(shù),函數(shù)名后臺(tái)已經(jīng)告知。 以前在面試的時(shí)候經(jīng)常遇到問(wèn)關(guān)于跨域的事兒,所以自己對(duì)跨域有一定的概念性了解,知道什么是跨域以及解決跨域的方法,但是具體實(shí)際從來(lái)沒(méi)有操作過(guò),直到最近在公司項(xiàng)目中,遇到了一個(gè)需要使i...
閱讀 1101·2021-10-11 10:59
閱讀 3685·2021-09-26 09:55
閱讀 946·2019-08-30 15:55
閱讀 2713·2019-08-30 15:44
閱讀 486·2019-08-30 14:06
閱讀 775·2019-08-30 11:26
閱讀 3404·2019-08-30 10:49
閱讀 2621·2019-08-29 12:53