有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互.

本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向:

1.iframe引入第三方应用

2.嵌入js片段

3.封装成SDK

本篇将主要介绍第一种, 通过iframe嵌入第三方页面, 接下来的几篇文章将分别介绍其他两种方式

使用iframe嵌入是目前使用很广泛的一种嵌入方案, 先看几个案例:

一. 使用案例

  • 搜狐移动端使用iframe嵌入广告:

  • 移动端视频网站使用iframe进行视频嵌入

  • 7724小游戏使用iframe嵌入游戏

二. 实现过程

  • iframe标签引入第三方页面地址

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #404040 }
span.s1 { }

  iframe的src设置为第三方服务器上部署的html页面,并将需要的参数作为URL的一部分传递给该页面

  • 获取参数请求数据

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #404040 }
span.s1 { }

  第三方页面中,首先获取到URL中的参数,根据参数向服务端发起ajax请求,获得页面需要展示的数据

  • 展示页面

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: right; font: 10.0px Helvetica; color: #404040 }
span.s1 { }

  根据获取的数据,将页面展示在主页面上

三. 通信方式

  由于iframe页面与主页面之间不在同下, 在iframe页面和主页面交互时, 会有跨域问题, 不能使用window.parent直接进行交互,目前跨域通信的方案有以下几种: 

  • 使用H5的PostMessage

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #404040 }
span.s1 { }

    HTML5新增的window.postMessage, 是一种安全的,基于事件的消息API.

  • 降级技术

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #404040 }
span.s1 { }

  对于低版本浏览器, 不支持PostMessage, 可使用以下降级方案:

    1.创建与父页面同源的ifame

    2.使用window.name属性

    3.通过hash

    4.使用 ADdobe Flash 对象

  • 使用easyXDM简化跨域

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Helvetica; color: #262626 }
span.s1 { }

  easyXDM是一个经过充分测试的JavaScript库,有如下优点

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Helvetica; color: #262626 }
span.s1 { }

    1.简化了跨域iframe之间的通信,并已经解决了所有的痛点.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "Trebuchet MS"; color: #000000 }
span.s1 { }

    2.easyXDM 集成了现有的多种跨域解决方案,针对不同浏览器可以适配最合适的方案

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Helvetica; color: #000000 }
span.s1 { }

    3.可以将原来写死在页面上的 iframe 改为通过 easyXDM.Rpc() 的方式进行加载,从而更灵活的实现iframe嵌入。

  下面是easyXDM的github地址: https://github.com/oyvindkinsey/easyXDM#readme

以上跨域通信的具体实现不在此详细介绍.

四. 使用iframe嵌入优劣势分析

优势:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #435b66 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #435b66; min-height: 22.0px }
span.s1 { }
span.s2 { color: #435a66 }

  1. 完全独立的DOM环境,不会受主页面的样式影响
  2. 完全独立的window,避免和主页面其他脚本冲突
  3. 不需要跨域进行数据请求
  4. 安全, 主页面无法访问和更改iframe的DOM环境

劣势:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #000000; min-height: 22.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #0000ff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #435b66; min-height: 22.0px }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "PingFang SC"; color: #435b66 }
span.s1 { }
span.s2 { text-decoration: underline }
span.s3 { }

  1. iframe增加了http请求次数
  2. iframe标签创建速度较慢 (可参考博客: https://www.cnblogs.com/sharpxiajun/p/4077515.html)
  3. 跨域iframe通信实现繁琐

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #404040 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 18.0px Helvetica; color: #404040 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica; color: #404040 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #435b66 }
span.s1 { }

第三方页面嵌入到web项目的方案 之 使用iframe嵌入的更多相关文章

  1. 广告等第三方应用嵌入到web页面方案 之 使用iframe嵌入

    有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互. 本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向: 1.iframe ...

  2. web项目自动化测试方案预研

    一.  网上方案整理 Watir.Watir-Webdriver.Selenium2.QTP区别 Waitr与Watir-WebDriver有什么区别? Watir是非常优秀的一款自动化测试工具.其使 ...

  3. 免费生成二维码接口,可直接嵌入到web项目中,附带嵌入方法,任意颜色二维码,任意大小二维码!

    在线体验连接:http://www.zhaimaojun.top/qrcode/ 你是否在项目中寻找方便而且免费的可以直接嵌入到项目中的二维码生成工具呢?你找到了这里,说明你已经找到了!不要犹豫直接拿 ...

  4. eclipse导入第三方jar包进入web项目的方法

    此方式是没有用maven进行构建的项目,纯动态项目. 具体方法: 1.通过Java Build Path导入. 比如我项目上要用servlet-api.jar这个包,我所用的web容器是tomcat, ...

  5. 在页面上获取web项目信息

    获取协议名称:request.getScheme() 获取域名:request.getServerName() 获取项目名称:request.getContextPath() 使用EL表达式获取项目名 ...

  6. 基于node-webkit的web项目打包方案

    下载node-webkit https://github.com/rogerwang/node-webkit 找到Downloads这一小节,然后下载对应平台的node-webkit预编译包.(为了介 ...

  7. web项目超时方案

    1. 场景描述 平台使用的Greenplum(内核是postgresql8.2)集群存储大数据量数据(每天一个表大概3亿),因为数据量比较大,所以在使用上有些限制,一是操作限制:二是不限制,但是到一定 ...

  8. 如何设置 web 项目打开的默认页面

    引言 我们在创建 Web 项目启动 Tomcat 会自动打开一个默认 index.jsp 页面,这个页面是创建 Web 项目时就自动生成的.那么,如何设置 web 项目打开的这个的默认页面,改为自己的 ...

  9. Hadoop Web项目--Mahout0.10 MR算法集锦

    1. 涉及技术及下载 项目开发使用到的软件有:Myeclipse2014,JDK1.8.Hadoop2.6,MySQL5.6.EasyUI1.3.6,jQuery2.0,Spring4.1.3,Hib ...

随机推荐

  1. 关于keil5使用注意事项(预定义、路径包含)

    2017.12.17  下午 终于在不用keil5自带添加库的基础上0 error的新建了一个工程.磕磕绊绊搞了快一个下午,各种小问题搞到崩溃. 首先是库文件添加路径的问题 ,只要是你工程中用到的头文 ...

  2. 局域网内一台电脑的ip地址自己会变,怎样让它不变

    有两种方法可以让局域网内的电脑拥有固定的ip地址: 方法一:使用DHCP的静态地址分配功能(以TP-Link TL-WR847路由器为例). 打开浏览器,输入路由器LAN口的ip地址和管理员用户名.密 ...

  3. 数据库复习总结(20)-存储过程以及.net调用存储过程

    一.存储过程(注意区分将一段select语句进行封装叫做视图)(1)将一段t-sql脚本进行封装,以完成一个逻辑操作(2)创建存储过程:            create proc 名称      ...

  4. CSS3 [attribute^=value] 选择器

    设置 class 属性值以 "test" 开头的所有 div 元素的背景色: div[class^="test"] { background:#ffff00; ...

  5. hive导出查询文件到本地文件的2种办法

    通过HQL语句 可以将hive 中表的数据生成到指定的目录. 有时候 我们可以利用hive来生成统计的中间文件(比源文件小的多的) 方法有如下2种: 1.INSERT OVERWRITE LOCAL ...

  6. Mac下Charles Contents乱码解决办法

    用到Charles,下载最新的4.0.1版本,但是发生乱码问题.百度好久才找到个靠谱的,那些说什么在Info.plist文件加字符串的,都是假的,反正我是试了都没用,这里记下详细的操作步骤解决: 1. ...

  7. c# winform 类似android toast消息功能

    先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...

  8. python_如何判断字符串a以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...

  9. linux 中 ping的回传值

      今天在学习鸟哥私房菜的过程中,不明白ping的回传值是怎么设置的,后来网上找的结果了,特此记录一下 1 题目大意是指,ping一个网段的机器,如果可以通,就显示UP,如果不通就显示Down,其中一 ...

  10. junit忽略测试方法

    JUnit 提供注解 org.junit.Ignore 用于暂时忽略某个测试方法或者说整个类.因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行. 1,方法级别上使用@ignore来注释 ...