广告等第三方应用嵌入到web页面方案 之 使用js片断

在本身的项目中嵌入过广告的朋友们可能都用过百度联盟, 只须要嵌入以下一段js代码片断, 就能够在本身的项目中嵌入广告, 来得到收益.javascript

<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片断的方式来嵌入广告等第三方的应用的, 具体的实现方案有两种:html

在服务端生成脚本:

  服务端接收到请求后, 从url中提取到参数, 再根据参数从数据库中查找出对应的数据信息,好比是广告的话, 就查找到对应的广告素材, 并将查询到的数据信息插到javascript模板中,java

浏览器执行js脚本代码,建立出广告数据库

直接引入静态js脚本:

  首先js文件中提取到参数,根据参数向服务端发起请求, 获取到对应的数据, 再经过js建立html片断,输出到页面上json

两种方案对比: 跨域

       服务端生成脚本,全部的代码和数据都包含在生成的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

相关文章
相关标签/搜索