亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

php main 與 iframe 相互通訊類(js+php同域/跨域)

2019-11-19 15:26:26
字體:
來源:轉載
供稿:網友

main 與 iframe 相互通訊類

之前寫過一篇《iframe與主框架跨域相互訪問方法》,介紹了main與iframe相互通訊的原理,不了解原理的可以先看看。

今天把main與iframe相互通訊的方法封裝成類,主要有兩個文件,

JS:FrameMessage.js 實現調用方法的接口,如跨域則創建臨時iframe,調用同域執行者。
PHP:FrameMessage.class.php 實現接收到跨域請求時,根據參數返回執行方法的JS code。

功能如下:

1.支持同域與跨域通訊
2.傳遞的方法參數支持字符串,JSON,數組等。

復制代碼 代碼如下:

FrameMessage.exec('http://127.0.0.1/execB.php', 'myframe', 'fIframe', ['fdipzone', '{"gender":"male","age":"29"}', '["http://blog.csdn.net/fdipzone", "http://weibo.com/fdipzone"]']); 

復制代碼 代碼如下:

FrameMessage.exec('http://localhost/execA.php', '', 'fMain', ['programmer', '{"first":"PHP","second":"javascript"}', '["EEG","NMG"]']);

因部分瀏覽器不支持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  /* 執行方法  executor 執行的頁面,為空則為同域  frame  要調用的方法的框架名稱,為空則為parent  func   要調用的方法名  args   要調用的方法的參數,必須為數組[arg1, arg2, arg3, argn...],方便apply調用       元素為字符串格式,請不要使用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 : []) : []; // 必須是數組    if(executor==''){      __fSameDomainExec(); // same domain    }else{      __fCrossDomainExec(); // cross domain    }  }  /* 同域執行 */  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);    }  }  /* 跨域執行 */  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();    }  }  /* 獲取執行的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();  }  /* 判斷是否數組 */  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 根據參數調用方法*  private returnJs 創建返回的javascript*  private jsFormat 轉義參數*/class FrameMessage{ // class start  /* execute 根據參數調用方法  * @param String $frame 要調用的方法的框架名稱,為空則為parent  * @param String $func 要調用的方法名  * @param JSONstr $args 要調用的方法的參數  * @return String  */  public static function execute($frame, $func, $args=''){    if(!is_string($frame) || !is_string($func) || !is_string($args)){      return '';    }    // frame 與 func 限制只能是字母數字下劃線    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++){ // 過濾參數,防止注入          $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.");");    }  }  /** 創建返回的javascript  * @param String $str  * @return String   */  private static function returnJs($str){    $ret = '<script type="text/javascript">'."/r/n";    $ret .= $str."/r/n";    $ret .= '</script>';    return $ret;  }  /** 轉義參數  * @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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> main window </title> <script type="text/javascript" src="json2.js"></script> <script type="text/javascript" src="FrameMessage.js"></script> <script type="text/javascript"> // main js function function fMain(profession, skill, company){	var skill_p = JSON.parse(skill);	var company_p = JSON.parse(company);		var msg = "main function execute success/n/n";	msg += "profession:" + profession + "/n";	msg += "first skill:" + skill_p.first + "/n";	msg += "second skill:" + skill_p.second + "/n";	msg += "company1:" + company_p[0] + "/n";	msg += "company2:" + company_p[1] + "/n";	alert(msg); } // exec iframe function function exec_iframe(){	// same domain	//FrameMessage.exec('', 'myframe', 'fIframe', ['fdipzone', '{"gender":"male","age":"29"}', '["http://blog.csdn.net/fdipzone", "http://weibo.com/fdipzone"]']);	// cross domain	FrameMessage.exec('http://127.0.0.1/execB.php', 'myframe', 'fIframe', ['fdipzone', '{"gender":"male","age":"29"}', '["http://blog.csdn.net/fdipzone", "http://weibo.com/fdipzone"]']); } </script> </head> <body> <p>A.html main</p> <p><input type="button" value="exec iframe function" onclick="exec_iframe()"></p> <!-- same domain --> <!--<iframe src="B.html" name="myframe" width="500" height="100"></iframe>--> <!-- cross domain --> <iframe src="http://127.0.0.1/B.html" name="myframe" width="500" height="100"></iframe> </body></html>

B.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> iframe window </title> <script type="text/javascript" src="json2.js"></script> <script type="text/javascript" src="FrameMessage.js"></script> <script type="text/javascript"> // iframe js function  function fIframe(name, obj, arr){		var obj_p = JSON.parse(obj);	var arr_p = JSON.parse(arr);		var msg = "iframe function execute success/n/n";	msg += "name:" + name + "/n";	msg += "gender:" + obj_p.gender + "/n";	msg += "age:" + obj_p.age + "/n";	msg += "blog:" + arr_p[0] + "/n";	msg += "weibo:" + arr_p[1] + "/n";	alert(msg); } // exec main function function exec_main(){	// same domain	//FrameMessage.exec('', '', 'fMain', ['programmer', '{"first":"PHP","second":"javascript"}', '["EEG","NMG"]']);	// cross domain	FrameMessage.exec('http://localhost/execA.php', '', 'fMain', ['programmer', '{"first":"PHP","second":"javascript"}', '["EEG","NMG"]']);  } </script> </head> <body> <p>B.html iframe</p> <p><input type="button" value="exec main function" onclick="exec_main()"></p> </body></html>

execA.php 與 execB.php

<?phprequire '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;?>

源碼下載地址:點擊查看

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品高潮呻吟久久av野狼| 亚洲精品视频网上网址在线观看| 亚洲精品久久7777777| 久久综合88中文色鬼| 欧美日韩在线一区| 亚洲永久免费观看| 91亚洲精品一区二区| 欧美极品在线播放| 亚洲欧美一区二区激情| 色综合久久久久久中文网| 国产精品久久久久久av福利软件| 欧美理论在线观看| 久久免费精品视频| 成人午夜在线影院| 性欧美视频videos6一9| 亚洲性线免费观看视频成熟| 高清欧美性猛交xxxx黑人猛交| 美女扒开尿口让男人操亚洲视频网站| 日韩欧美精品网站| 亚洲精品影视在线观看| 欧美老妇交乱视频| 国产高清视频一区三区| 日韩极品精品视频免费观看| 国产精品爱久久久久久久| 亚洲国产成人精品久久久国产成人一区| 日韩激情在线视频| 米奇精品一区二区三区在线观看| 精品久久久久久久久久久久| 国产欧美日韩精品丝袜高跟鞋| 福利视频一区二区| 亚洲第一免费播放区| 亚洲国产成人91精品| 国产成人精品免费视频| 中日韩美女免费视频网站在线观看| 欧美高清videos高潮hd| 97国产在线视频| 日韩有码在线视频| 久久亚洲精品中文字幕冲田杏梨| 久久精品国产亚洲精品2020| 欧美色播在线播放| 另类图片亚洲另类| 国产成人免费av电影| 色综合伊人色综合网| 91午夜在线播放| 久久久精品网站| 伊人伊成久久人综合网站| 国产综合视频在线观看| 久久国产精品久久国产精品| 91成人在线播放| 91亚洲精品一区二区| 国产精品久久久久久久久久| 欧美日韩国产第一页| 久久中文字幕在线视频| 国产精品久久久精品| 51精品国产黑色丝袜高跟鞋| 91亚洲精品一区二区| 亚洲人成电影网| 亚洲成人精品久久| 亚洲高清免费观看高清完整版| 中文字幕少妇一区二区三区| 国产日韩在线一区| 九色91av视频| 欧美激情成人在线视频| 久久露脸国产精品| 成人黄色免费网站在线观看| 国产视频在线一区二区| 国产亚洲激情视频在线| 欧美贵妇videos办公室| 日韩av色综合| 久久精品国产2020观看福利| 亚洲成人精品在线| 久久久久久久999精品视频| 国产美女搞久久| 九九热这里只有在线精品视| 亚洲精选一区二区| 97精品国产97久久久久久免费| 亚洲aⅴ日韩av电影在线观看| 性欧美办公室18xxxxhd| 亚洲午夜av电影| 欧美成人免费全部| 欧美丰满少妇xxxxx做受| 亚洲人成77777在线观看网| 国产亚洲精品综合一区91| 日韩欧美国产网站| 欧洲中文字幕国产精品| 伊人精品在线观看| 亚洲免费精彩视频| 日韩精品高清视频| 永久免费看mv网站入口亚洲| 精品久久久国产| 美女福利视频一区| 国产精品色午夜在线观看| 中文字幕在线看视频国产欧美| 久久久久久久久久久免费精品| 日韩av不卡在线| 亚洲视频国产视频| 亚洲精品美女久久久久| 国产成人精品日本亚洲专区61| 精品亚洲aⅴ在线观看| 欧洲精品久久久| 国产精品ⅴa在线观看h| 日韩色av导航| 97福利一区二区| 91丝袜美腿美女视频网站| 久久久视频免费观看| 伊人久久免费视频| 日韩成人激情在线| 精品视频久久久久久| 久久影院在线观看| 日韩国产激情在线| 亚洲精品美女久久久久| 久久久久国产精品免费网站| 久久久久久999| 中文字幕精品一区久久久久| 日本国产一区二区三区| 亚洲图片在区色| 91成人国产在线观看| 欧美国产日韩一区二区三区| 欧美激情在线观看视频| 精品国内亚洲在观看18黄| 国产精品a久久久久久| 色多多国产成人永久免费网站| 久久91亚洲精品中文字幕| 久久精品久久久久久| 久久久久免费精品国产| 欧美日韩另类在线| 九九久久综合网站| 久久亚洲国产成人| 91在线播放国产| 国产精品视频精品视频| 日韩av手机在线观看| 国产精品一二三在线| 97在线观看视频| 国产精品第100页| 日韩a**中文字幕| 成人免费福利视频| 久久综合亚洲社区| 亚洲美女av在线播放| 日韩美女毛茸茸| 欧美激情中文网| 亚洲国产精品va在线看黑人动漫| 国产精品久久中文| 91精品久久久久久久久久久久久| 日本成人免费在线| 亚洲色图色老头| 中文字幕日韩精品有码视频| 久久精品色欧美aⅴ一区二区| 欧美裸体xxxx极品少妇| 另类少妇人与禽zozz0性伦| 美女国内精品自产拍在线播放| 国产精品久久中文| 91在线视频成人| 成人精品福利视频| 久久久中文字幕| 久久九九免费视频| 久久精品福利视频| 欧美另类精品xxxx孕妇| 欧美日韩午夜剧场| 国产成人精品av在线| 亚洲欧洲日产国码av系列天堂| 一个人看的www久久| 国产精品永久免费观看| 亚洲国产日韩欧美在线99| 国产日韩在线免费|