欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript使ifram跨域相互訪問及與PHP通信的實(shí)例

 更新時(shí)間:2016年03月03日 16:57:45   作者:傲雪星楓  
這篇文章主要介紹了JavaScript使ifram跨域相互訪問及與PHP通信的實(shí)例,同時(shí)對(duì)同域間的訪問也作了詳細(xì)的演示,需要的朋友可以參考下

iframe 與主框架相互訪問方法

1.同域相互訪問

假設(shè)A.html 與 b.html domain都是localhost (同域)
A.html中iframe 嵌入 B.html,name=myframe
A.html有js function fMain()
B.html有js function fIframe()
需要實(shí)現(xiàn) A.html 調(diào)用 B.html 的 fIframe(),B.html 調(diào)用 A.html 的 fMain()

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"> 
 // main js function 
 function fMain(){ 
 alert('main function execute success'); 
 } 
 
 // exec iframe function 
 function exec_iframe(){ 
 window.myframe.fIframe(); 
 } 
 </script> 
 
 </head> 
 
 <body> 
 <p>A.html main</p> 
 <p><input type="button" value="exec iframe function" onclick="exec_iframe()"></p> 
 <iframe src="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"> 
 // iframe js function 
 function fIframe(){ 
 alert('iframe function execute success'); 
 } 
 
 // exec main function 
 function exec_main(){ 
 parent.fMain(); 
 } 
 </script> 
 
 </head> 
 
 <body> 
 <p>B.html iframe</p> 
 <p><input type="button" value="exec main function" onclick="exec_main()"></p> 
 </body> 
</html> 

點(diǎn)擊A.html 的 exec iframe function button,執(zhí)行成功,彈出iframe function execute success。如下圖

201633165209664.jpg (537×208)

點(diǎn)擊B.html 的 exec main function button,執(zhí)行成功,彈出 main function execute success。如下圖

201633165228804.jpg (536×208)

2.跨域互相訪問

假設(shè) A.html domain是 localhost, B.html domain 是 127.0.0.1 (跨域)
這里使用 localhost 與 127.0.0.1 只是方便測(cè)試,localhost 與 127.0.0.1已經(jīng)不同一個(gè)域,因此執(zhí)行效果是一樣的。
實(shí)際使用時(shí)換成 www.domaina.com 與 www.domainb.com 即可。
A.html中iframe 嵌入 B.html,name=myframe
A.html有js function fMain()
B.html有js function fIframe()
需要實(shí)現(xiàn) A.html 調(diào)用 B.html 的 fIframe(),B.html 調(diào)用 A.html 的 fMain() (跨域調(diào)用)

如果使用上面同域的方法,瀏覽器判斷A.html 與 B.html 不同域,會(huì)有錯(cuò)誤提示。
Uncaught SecurityError: Blocked a frame with origin "http://localhost" from accessing a frame with origin "http://127.0.0.1". Protocols, domains, and ports must match.

實(shí)現(xiàn)原理:
因?yàn)闉g覽器為了安全,禁止了不同域訪問。因此只要調(diào)用與執(zhí)行的雙方是同域則可以相互訪問。

首先,A.html 如何調(diào)用B.html的 fIframe方法
1.在A.html 創(chuàng)建一個(gè) iframe
2.iframe的頁面放在 B.html 同域下,命名為execB.html
3.execB.html 里有調(diào)用B.html fIframe方法的js調(diào)用

<script type="text/javascript"> 
parent.window.myframe.fIframe(); // execute parent myframe fIframe function 
</script> 

這樣A.html 就能通過 execB.html 調(diào)用 B.html 的 fIframe 方法了。

同理,B.html 需要調(diào)用A.html fMain方法,需要在B.html 嵌入與A.html 同域的 execA.html
execA.html 里有調(diào)用 A.html fMain 方法的js 調(diào)用

<script type="text/javascript"> 
parent.parent.fMain(); // execute main function 
</script> 

這樣就能實(shí)現(xiàn) A.html 與 B.html 跨域相互調(diào)用。

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"> 
 
 // main js function 
 function fMain(){ 
 alert('main function execute success'); 
 } 
 
 // exec iframe function 
 function exec_iframe(){ 
 if(typeof(exec_obj)=='undefined'){ 
  exec_obj = document.createElement('iframe'); 
  exec_obj.name = 'tmp_frame'; 
  exec_obj.src = 'http://127.0.0.1/execB.html'; 
  exec_obj.style.display = 'none'; 
  document.body.appendChild(exec_obj); 
 }else{ 
  exec_obj.src = 'http://127.0.0.1/execB.html?' + Math.random(); 
 } 
 } 
 </script> 
 
 </head> 
 
 <body> 
 <p>A.html main</p> 
 <p><input type="button" value="exec iframe function" onclick="exec_iframe()"></p> 
 <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"> 
 // iframe js function 
 function fIframe(){ 
 alert('iframe function execute success'); 
 } 
 
 // exec main function 
 function exec_main(){ 
 if(typeof(exec_obj)=='undefined'){ 
  exec_obj = document.createElement('iframe'); 
  exec_obj.name = 'tmp_frame'; 
  exec_obj.src = 'http://localhost/execA.html'; 
  exec_obj.style.display = 'none'; 
  document.body.appendChild(exec_obj); 
 }else{ 
  exec_obj.src = 'http://localhost/execA.html?' + Math.random(); 
 } 
 } 
 </script> 
 
 </head> 
 
 <body> 
 <p>B.html iframe</p> 
 <p><input type="button" value="exec main function" onclick="exec_main()"></p> 
 </body> 
</html> 

execA.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> exec main function </title> 
 </head> 
 
 <body> 
 <script type="text/javascript"> 
  parent.parent.fMain(); // execute main function 
 </script> 
 </body> 
</html> 

execB.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> exec iframe function </title> 
 </head> 
 
 <body> 
 <script type="text/javascript"> 
  parent.window.myframe.fIframe(); // execute parent myframe fIframe function 
 </script> 
 </body> 
</html> 

執(zhí)行如下圖:

201633165339112.jpg (529×214)


php main 與 iframe 相互通訊類(同域/跨域)
把main與iframe相互通訊的方法封裝成類,主要有兩個(gè)文件,
JS:FrameMessage.js 實(shí)現(xiàn)調(diào)用方法的接口,如跨域則創(chuàng)建臨時(shí)iframe,調(diào)用同域執(zhí)行者。
PHP:FrameMessage.class.php 實(shí)現(xiàn)接收到跨域請(qǐng)求時(shí),根據(jù)參數(shù)返回執(zhí)行方法的JS code。

功能如下:
1.支持同域與跨域通訊
2.傳遞的方法參數(shù)支持字符串,JSON,數(shù)組等。

201633165429252.jpg (549×249)

復(fù)制代碼 代碼如下:
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"]']); 

201633170000506.jpg (527×242)

復(fù)制代碼 代碼如下:
FrameMessage.exec('http://localhost/execA.php', '', 'fMain', ['programmer', '{"first":"PHP","second":"javascript"}', '["EEG","NMG"]']);

FrameMessage.js

/** Main 與 Iframe 相互通訊類 支持同域與跨域通訊 
* Date: 2013-12-29 
* Author: fdipzone 
* Ver: 1.0 
*/ 
var FrameMessage = (function(){ 
 
 this.oFrameMessageExec = null; // 臨時(shí)iframe 
 
 /* 執(zhí)行方法 
 executor 執(zhí)行的頁面,為空則為同域 
 frame 要調(diào)用的方法的框架名稱,為空則為parent 
 func  要調(diào)用的方法名 
 args  要調(diào)用的方法的參數(shù),必須為數(shù)組[arg1, arg2, arg3, argn...],方便apply調(diào)用 
    元素為字符串格式,請(qǐng)不要使用html,考慮注入安全的問題會(huì)過濾 
 */ 
 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 = '<script type="text/javascript">'."\r\n"; 
  $ret .= $str."\r\n"; 
  $ret .= '</script>'; 
 
  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

<!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

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

相關(guān)文章

  • js實(shí)現(xiàn)一鍵換膚效果

    js實(shí)現(xiàn)一鍵換膚效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)一鍵換膚效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js給table賦值的實(shí)例代碼

    js給table賦值的實(shí)例代碼

    下面小編就為大家?guī)硪黄猨s給table賦值的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • JavaScript中Promise的簡(jiǎn)單使用及其原理詳解

    JavaScript中Promise的簡(jiǎn)單使用及其原理詳解

    Promise是ES6最重要的特性之一,今天小編就來帶大家一起系統(tǒng)且細(xì)致的研究一下Promise的用法以及原理,感興趣的小伙伴可以學(xué)習(xí)一下哦
    2023-03-03
  • JavaScript實(shí)現(xiàn)鼠標(biāo)滑過處生成氣泡的方法

    JavaScript實(shí)現(xiàn)鼠標(biāo)滑過處生成氣泡的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)滑過處生成氣泡的方法,涉及鼠標(biāo)事件與頁面樣式的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • 小程序?qū)崿F(xiàn)tab標(biāo)簽頁

    小程序?qū)崿F(xiàn)tab標(biāo)簽頁

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)tab標(biāo)簽頁,可點(diǎn)擊切換,滑動(dòng)切換頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 詳解JS中的堆棧,事件循環(huán),執(zhí)行上下文和作用域以及閉包

    詳解JS中的堆棧,事件循環(huán),執(zhí)行上下文和作用域以及閉包

    這篇文章主要為大家詳細(xì)介紹了JavaScript中的堆棧,事件循環(huán),執(zhí)行上下文和作用域以及閉包的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01
  • Bootstrap組件學(xué)習(xí)之導(dǎo)航、標(biāo)簽、面包屑導(dǎo)航(精品)

    Bootstrap組件學(xué)習(xí)之導(dǎo)航、標(biāo)簽、面包屑導(dǎo)航(精品)

    這篇文章主要介紹了Bootstrap組件學(xué)習(xí)之導(dǎo)航、標(biāo)簽、面包屑導(dǎo)航(精品)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • JavaScript表單驗(yàn)證實(shí)現(xiàn)過程詳解

    JavaScript表單驗(yàn)證實(shí)現(xiàn)過程詳解

    表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)通過一定的規(guī)則來確保用戶提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關(guān)于el-form表單驗(yàn)證的一些實(shí)用方法,需要的朋友可以參考下
    2023-01-01
  • JS實(shí)現(xiàn)獲取各種格式的時(shí)間

    JS實(shí)現(xiàn)獲取各種格式的時(shí)間

    在?JavaScript?中,可以使用內(nèi)置的?Date?對(duì)象來獲取當(dāng)前時(shí)間,并根據(jù)需要格式化成不同的時(shí)間格式,下面就跟隨小編一起來看看具體的使用吧
    2023-08-08
  • 詳解js常用分割取字符串的方法

    詳解js常用分割取字符串的方法

    這篇文章主要介紹了js常用分割取字符串的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論