Home>Article>Backend Development> Introduction to the mutual communication class between php main and iframe (same domain/cross domain)

Introduction to the mutual communication class between php main and iframe (same domain/cross domain)

jacklove
jacklove Original
2018-06-09 14:29:16 1415browse

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.stringifyJSON.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

'."\r\n"; $ret .= $str."\r\n"; $ret .= ''; 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

       main window
       

A.html main

B.html

       iframe window
       

B.html iframe

execA.php 与 execB.php

本篇文章讲解关于php main 与 iframe 相互通讯类(同域/跨域)的介绍 ,更多相关内容请关注php中文网。

相关推荐:

如何使用php 异步调用方法

如何让php 根据url自动生成缩略图,并处理高并发问题

关于php 字符串压缩方法之间的比较

The above is the detailed content of Introduction to the mutual communication class between php main and iframe (same domain/cross domain). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn