本文讲解Javascript通过创建iframe异步加载解决跨域问题
很多情况下广告的同步加载会影响大主页面的加载,导致主页面的onload事件的执行被延迟,这里提供了一个简单的异步加载广告的方法。
例如a.html为主页面
XML/HTML代码
test page 广告位之前内容
广告将会异步加载:
我在广告位之后,但广告位不会影响我加载
下面是z.js的代码:
Java代码
(function(d) { document.write(''); var iframe = document.getElementById('adbox').appendChild(d.createElement('iframe')); doc = iframe.contentWindow.document; iframe.style.cssText = "width:300px;height:250px;"; doc.open().write(''); doc.close(); })(document);
主要的思路就是同步创建一个DIV,这个基本上对页面加载的影响可以忽略。然后通过异步的方式向这个DIV中追加一个iframe,由这个iframe负责加载广告内容,并且这个iframe的加载方式同样也是异步方式,不会影响到主页面的load。
下面看一下22.js文件,无外乎就是处理请求,抛出素材,这里简化下,直接向iframe的body内赋值。
Java代码
//var e = document.createElement("input"); //e.type = "button"; //e.value = "点我"; //document.body.appendChild(e); //或者通过上面的appendChild进行节点添加,但是切记不要用document.write输出内容 document.body.innerHTML = '测试内容';
上面通过SRC加载URL地址的加载方式可能在平时主要的广告部署方式下并不常见,更多的则是一段JS代码。例如百度的广告代码
XML/HTML代码
这里是在body中加载的,是无法通过SRC来实现的。这时我们可以通过向iframe的BODY中动态写入内容的方式来执行。
代码如下:
JavaScript代码
这样的话实际上广告是算在iframe中加载的,不会阻塞主页面的加载速度,而且不存在跨域的问题。
但是在实际部署中,在IE8以下的IE内核浏览器中会存在广告尚未加载完成,页面已经终止的情况。具体原因是IE8以下的浏览器的document.close()的执行并不会向其它浏览器那样会等待document中的内容加载完成后再执行。即:百度广告平台的代码刚刚开始执行,尚未解析出该抛出什么广告的时候,页面已经开始执行document.close()已经将文档关闭,广告代码的加载就被终止了。如果你不写document.close()的话此问题将不存在,但是会影响整个主页面的onload事件。
还有一种方式,就是判断浏览器,在IE8以下用延迟执行document.close()的方式解决此问题,但是同样也会多少影响主页面onload事件。