main 與 iframe 相互通訊類
成都創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團隊及專業(yè)的網(wǎng)站設(shè)計師團隊。
之前寫過一篇《iframe與主框架跨域相互訪問方法》,介紹了main與iframe相互通訊的原理,不了解原理的可以先看看。
今天把main與iframe相互通訊的方法封裝成類,主要有兩個文件,
JS:FrameMessage.js 實現(xiàn)調(diào)用方法的接口,如跨域則創(chuàng)建臨時iframe,調(diào)用同域執(zhí)行者。
PHP:FrameMessage.class.php 實現(xiàn)接收到跨域請求時,根據(jù)參數(shù)返回執(zhí)行方法的JS code。
功能如下:
1.支持同域與跨域通訊
2.傳遞的方法參數(shù)支持字符串,JSON,數(shù)組等。
因部分瀏覽器不支持JSON.stringify 與JSON.parse 方法(如IE6/7),為了兼容,需要包含json2.js,下載地址:
https://github.com/douglascrockford/JSON-js
FrameMessage.js
/** Main 與 Iframe 相互通訊類 支持同域與跨域通訊 * Date: 2013-12-29 * Author: fdipzone * Ver: 1.0 */ var FrameMessage = (function(){ this.oFrameMessageExec = null; // 臨時iframe /* 執(zhí)行方法 executor 執(zhí)行的頁面,為空則為同域 frame 要調(diào)用的方法的框架名稱,為空則為parent func 要調(diào)用的方法名 args 要調(diào)用的方法的參數(shù),必須為數(shù)組[arg1, arg2, arg3, argn...],方便apply調(diào)用 元素為字符串格式,請不要使用html,考慮注入安全的問題會過濾 */ this.exec = function(executor, frame, func, args){ this.executor = typeof(executor)!='undefined'? executor : ''; this.frame = typeof(frame)!='undefined'? frame : ''; this.func = typeof(func)!='undefined'? func : ''; this.args = typeof(args)!='undefined'? (__fIsArray(args)? args : []) : []; // 必須是數(shù)組 if(executor==''){ __fSameDomainExec(); // same domain }else{ __fCrossDomainExec(); // cross domain } } /* 同域執(zhí)行 */ function __fSameDomainExec(){ if(this.frame==''){ // parent parent.window[this.func].apply(this, this.args); }else{ window.frames[this.frame][this.func].apply(this, this.args); } } /* 跨域執(zhí)行 */ function __fCrossDomainExec(){ if(this.oFrameMessageExec == null){ this.oFrameMessageExec = document.createElement('iframe'); this.oFrameMessageExec.name = 'FrameMessage_tmp_frame'; this.oFrameMessageExec.src = __fGetSrc(); this.oFrameMessageExec.style.display = 'none'; document.body.appendChild(this.oFrameMessageExec); }else{ this.oFrameMessageExec.src = __fGetSrc(); } } /* 獲取執(zhí)行的url */ function __fGetSrc(){ return this.executor + (this.executor.indexOf('?')==-1? '?' : '&') + 'frame=' + this.frame + '&func=' + this.func + '&args=' + JSON.stringify(this.args) + '&framemessage_rand=' + Math.random(); } /* 判斷是否數(shù)組 */ function __fIsArray(obj){ return Object.prototype.toString.call(obj) === '[object Array]'; } return this; }());
FrameMessage.class.php
<?php /** Frame Message class main 與 iframe 相互通訊類 * Date: 2013-12-29 * Author: fdipzone * Ver: 1.0 * * Func: * public execute 根據(jù)參數(shù)調(diào)用方法 * private returnJs 創(chuàng)建返回的javascript * private jsFormat 轉(zhuǎn)義參數(shù) */ class FrameMessage{ // class start /* execute 根據(jù)參數(shù)調(diào)用方法 * @param String $frame 要調(diào)用的方法的框架名稱,為空則為parent * @param String $func 要調(diào)用的方法名 * @param JSONstr $args 要調(diào)用的方法的參數(shù) * @return String */ public static function execute($frame, $func, $args=''){ if(!is_string($frame) || !is_string($func) || !is_string($args)){ return ''; } // frame 與 func 限制只能是字母數(shù)字下劃線 if(($frame!='' && !preg_match('/^[A-Za-z0-9_]+$/',$frame)) || !preg_match('/^[A-Za-z0-9_]+$/',$func)){ return ''; } $params_str = ''; if($args){ $params = json_decode($args, true); if(is_array($params)){ for($i=0,$len=count($params); $i<$len; $i++){ // 過濾參數(shù),防止注入 $params[$i] = self::jsFormat($params[$i]); } $params_str = "'".implode("','", $params)."'"; } } if($frame==''){ // parent return self::returnJs("parent.parent.".$func."(".$params_str.");"); }else{ return self::returnJs("parent.window.".$frame.".".$func."(".$params_str.");"); } } /** 創(chuàng)建返回的javascript * @param String $str * @return String */ private static function returnJs($str){ $ret = ''; return $ret; } /** 轉(zhuǎn)義參數(shù) * @param String $str * @return String */ private static function jsFormat($str){ $str = strip_tags(trim($str)); // 過濾html $str = str_replace('\\s\\s', '\\s', $str); $str = str_replace(chr(10), '', $str); $str = str_replace(chr(13), '', $str); $str = str_replace(' ', '', $str); $str = str_replace('\\', '\\\\', $str); $str = str_replace('"', '\\"', $str); $str = str_replace('\\\'', '\\\\\'', $str); $str = str_replace("'", "\'", $str); return $str; } } // class end ?>
A.html
main window A.html main
B.html
iframe window B.html iframe
execA.php 與 execB.php
<?php require 'FrameMessage.class.php'; $frame = isset($_GET['frame'])? $_GET['frame'] : ''; $func = isset($_GET['func'])? $_GET['func'] : ''; $args = isset($_GET['args'])? $_GET['args'] : ''; $result = FrameMessage::execute($frame, $func, $args); echo $result; ?>
源碼下載地址:點擊查看