广告等第三方应用嵌入到web页面方案 之 使用js片段
在自己的项目中嵌入过广告的朋友们可能都用过百度联盟, 只需要嵌入如下一段js代码片段, 就可以在自己的项目中嵌入广告, 来获得收益.
<script type=“text javascript”>
var cpro_id = “u2557752”;
</script>
<script src=“http://cpro.baidustatic.com/cpro/ui/cm.js?id='i9898'” type=“text/javascript”></script>
本文就是主要介绍如何通过嵌入js片段的方式来嵌入广告等第三方的应用的, 具体的实现方案有两种:
在服务端生成脚本:
服务端接收到请求后, 从url中提取到参数, 再根据参数从数据库中查找出对应的数据信息,比如是广告的话, 就查找到对应的广告素材, 并将查询到的数据信息插到javascript模板中,
浏览器执行js脚本代码,创建出广告
直接引入静态js脚本:
首先js文件中提取到参数,根据参数向服务端发起请求, 获取到对应的数据, 再通过js创建html片段,输出到页面上
两种方案对比:
服务端生成脚本,所有的代码和数据都包含在生成的js文件中,不需要做额外的请求,适用于内容及样式相对简单的页面.比如只有一个图片的广告展示.对于内容较多,样式较为复杂的内容展示通过第二种方案实现更加灵活.
两种方案实现起来, 主要以下几步:
1.获取参数 --> 2.获取数据 --> 3.输出html
1.传递参数
下面介绍一下脚本参数传递的几种方式的优缺点:
1.通过拼接URL传递
<script src=“http://cpro.baidustatic.com/cpro/ui/cm.js?cpro_id=u2557752” type=“text/javascript”></script>
优点: 可通过URL传递到服务器
缺点: 必须进行DOM查询,无法缓存
2.通过hash传递
<script src=“http://cpro.baidustatic.com/cpro/ui/cm.js#cpro_id=u2557752” type=“text/javascript”></script>
优点: 使用URL,便于缓存
缺点: 必须进行DOM查询
3.自定义属性
<script data-hxh-coupon-id=‘1234’ src=“http://cpro.baidustatic.com/cpro/ui/cm.js type=“text/javascript”></script>
优点: 可读性强, 便于缓存, 易于识别脚本引入代码的位置
缺点: 必须进行DOM查询
4.使用全局变量
<script type=“text/javascript”>
var couponId = ‘87393’;
</script>
<script src=“http://cpro.baidustatic.com/cpro/ui/cm.js type=“text/javascript”></script>
优点: 可读性强,便于缓存,参数类型灵活,无需进行DOM查询
缺点: 使用了全局变量
2.获取数据
关于获取数据, 服务端生成脚本, 服务端直接查询数据, 静态js脚本方案中, 可使用jsonP, Cors等方案进行跨域请求.
3.输出html
- 使用document.write
document.write直接在当前文档流中写入字符串,一旦文档流已经关闭,就打开新的文档流并写入,原来的文档流会被清空,已渲染好的页面就会被清除,浏览器将重新构建DOM并渲染页面.所以使用这种方案, 就一必须是同步执行嵌入的这段js代码, 作为第三方脚本引入,阻塞性的脚本会阻止主页面的渲染,如果js文件加载迟缓,甚至不可用的, 会给主页面造成严重的性能问题, 所有不建议使用.
操作DOM添加
1.在目标位置嵌入js片段, 并使用预先定义的ID,class,data-*等(如上)
2.js文件中创建DOM元素,将HTML字符串赋值给元素的innerHTML属性
3.根据ID,calss,data-*等查询到脚本所在位置,并将元素添加到DOM中
<script id='hxh-coupon-scandown' type="text/javascript">
(function(){
var script = document.createElement('script');
script.async = true;
script.src = 'http://www.boxmars.com?id=123';
var entry = document.getElementsByTagName('script')[0];
entry.parentNode.insertBefore(script, entry);
})()
</script>
优点:
1.可以异步加载第三方DOM, 不阻塞主页面的渲染,即使js出错,也不会影响到主页面
2.可以将创建的DOM动态插入到已存在的元素之后(即可以追加到已知位置)
缺点:
1.使用字符串拼接不利于HTML片段的编写和维护
2.会继承父页面样式
3.主页面可更改DOM内容
字符串拼接不利于编写和维护的问题,可以通过JavaScript模板引擎库来编写HTML片段, 流行模板库:HandlebarsJS,Mustache,BAIDU-Template,artTemplate等
使用不设置src的iframe
主页面提供一个不设置src的iframe标签,通过iframe的contentWindow访问iframe的DOM,使用document.write将HTML直接写入到iframe中
var doc = document.getElementsByTagName('iframe')[0].contentWindow.document;
doc.writeln("<button id=\'btn\'>点击</button>");
doc.writeln("<script type=\'text/javascript\'>");
doc.writeln("var btn = document.getElementById(\'btn\');");
doc.writeln("btn.onclick = function(){");
doc.writeln("parent.parentEvent();");
doc.writeln("</script>");
doc.close();
注: iframe由浏览器异步处理, 所以此处使用document.write()并不会阻止父页面的加载
优点:
1.完全独立的DOM环境,不会继承父页面的样式
2完全独立的window,避免和主页面其他脚本冲突
3.可直接与主页面进行交互(与iframe引入外部页面对比)
缺点:
1. Iframe标签的创建速度慢
2.主页面可以访问iframe的DOM环境并可进行更改
嵌入第三方页面两种方案中,另一种方案(http://www.cnblogs.com/yuqing6/p/8462239.html) 都大篇幅介绍使用了iframe进行html输出,iframe提供了一种最佳的避免样式和脚本冲突的嵌入途径,但是有些情况在主页面的DOM中去渲染更为合适
不适合使用iframe的情况:
1.需要在iframe外部呈现内容, 场景: 第三方应用中需要弹出对话框时,如果iframe不是覆盖整个页面的, 就无法正常展示对话框
2.一个页面引入很多个iframe嵌入页面, 同一个页面引入许多个iframe时, 会带来主页面很大的性能开销, 对于只是渲染一两次情况, 这种性能消耗可以忽略不计
3.需要继承父页面的基础样式, 有些时候,希望第三方应用继承父页面的基础样式, 来和主页面的样式风格保持一致,这种情况不适用于使用iframe
广告等第三方应用嵌入到web页面方案 之 使用js片段的更多相关文章
- 广告等第三方应用嵌入到web页面方案 之 使用iframe嵌入
有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互. 本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向: 1.iframe ...
- 海康威视 嵌入到web页面相关问题
因项目上面需求,接触到了海康威视的设备,要把他嵌入到web页面中,所以就开始了爬坑之路 刚开始不知道如何把设备的页面嵌入到项目的web页面中,直到我遇见了他——“WEB3.0控件开发包V1.0.9_C ...
- 解决加载WEB页面时,由于JS文件引用过多影响页面打开速度的问题
1.一般做法 一般我们会把所有的<script>元素都应该放在页面的<head>标签里,但由于是顺序加载,因此只有当所有JavaScript代码都被依次下载.解析和执行完之后, ...
- 第三方页面嵌入到web项目的方案 之 使用iframe嵌入
有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互. 本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向: 1.iframe ...
- 关于ios原声嵌入web页面的问题
当在一个界面中既有原生又有web的时候,如果想让上下整体滑动的话,我们怎么确定web的高度呢,下面分享一下我的心得 首先在webView的代理方法中我们可以获取到加载完整个web页面的高度 - (vo ...
- 分享到微信微博空间等第三方平台的JS代码
分享功能有利于传播更多优质的内容,所以在web项目中也是比较常用的.今天就抽空整理下常用的分享平台的JS代码.这些代码可以在对应平台的官方网站上生成,官网上对分享内容的参数也有详尽说明.这里只对常用的 ...
- 如何本地测试例如QQ登录等第三方接口
前言:现在基本是个网站就会集成第三方的一些接口,比如QQ登录.分享等等.但是在开发的时候,尤其是没有这方面经验的开发人员来说,调试流程时会显得迷茫,不知道怎么调试.这里就个人的这方面学习摸索做一个总结 ...
- 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(上) 微信、QQ、新浪微博等第三方登录,你想知道的都在这了(下)
微信.QQ.新浪微博等第三方登录,你想知道的都在这了(上):https://www.jianshu.com/p/133d84042483 微信.QQ.新浪微博等第三方登录,你想知道的都在这了(下):h ...
- 如何把Power BI嵌入到Web应用中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这篇其实不是一个操作向导了,主要对Power BI的嵌入特性进行探讨. Power BI ...
随机推荐
- ios开发-第二天
1.#import可保证无论头文件出现多少次,只包含一次,而#include相反. 2.如果用户不提供文件路径的话,那么argc的值为1,可以用来做是否错误的判断. 3.面向对象和面向过程的区别 面向 ...
- CCF系列之画图(201409-2)
试题编号: 201409-2试题名称: 画图时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从 ...
- 更改sql多条数据,更新替换字符串中固定的字符串
需求产生的背景: 数据库里建库时插入了字典数据,可是这个字典数据,有一些是不准确的,所以就需要把一些固定的数据查出来替换掉. 问题解决逻辑: 大体逻辑是,首先把固定需要替换的字符串提取出来,赋值给变量 ...
- 免费ssl证书申请和在IIS上启用https的使用教程
因为微信小程序开发涉及到ssl证书,所以折腾了几天的这个. 非常感谢”亚洲诚信-TrustAsia“公司的售后工程师黄工(QQ2355718943 TEL:021-58895880-663)提供的技术 ...
- hash类型
redis的hash是一个string的key与value的映射表.适合存储对象,与string的类型相比,可以节省内存,并且方便获取整个对象 hset 设置hash field的指定值.不存在则先 ...
- Long转Date/页面自定义标签
运行时发现异常:org.apache.jasper.JasperException: javax.el.ELException: java.lang.IllegalArgumentException: ...
- 错误:Unsupported major.minor version 51.0的解决
问题: 在电脑上双击打开一个可执行的jar时报错:Unsupported major.minor version 51.0.原因是版本问题,该jar使用jdk1.7编译,而我电脑装的是jdk1.6. ...
- 开发JQuery插件(转)
教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...
- Codeforce A. Fair Game
A. Fair Game time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- spring之注解详解
一.类级别注解 通用:@Component("id") Controller层:@Controller("id") Service层:@Service(&quo ...