网站地图    收藏   

主页 > 前端 > javascript >

Javascript通过创建iframe异步加载解决跨域问题

来源:未知    时间:2015-07-29 11:48 作者:xxadmin 阅读:

[导读] 本文讲解Javascript通过创建iframe异步加载解决跨域问题 很多情况下广告的同步加载会影响大主页面的加载,导致主页面的onload事件的执行被延迟,这里提供了一个简单的异步加载广告的...

本文讲解Javascript通过创建iframe异步加载解决跨域问题

很多情况下广告的同步加载会影响大主页面的加载,导致主页面的onload事件的执行被延迟,这里提供了一个简单的异步加载广告的方法。


例如a.html为主页面

XML/HTML代码


<!doctype html>  
<html>  
<head>  
    <title>test page</title>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    </head>  
    <body>  
    <div>  
    <p>广告位之前内容</p>  
      
    <p>广告将会异步加载:</p>  
    <div style="width:300px; height:250px; border:solid 1px red">  
    <script type="text/javascript" src="js/z.js"></script>  
    </div>  
      
    <p>我在广告位之后,但广告位不会影响我加载</p>  
    </div>  
      
</body>
</html>

 


 


下面是z.js的代码:

Java代码


    (function(d) {  
        document.write('<div id="adbox"></div>');  
        var iframe = document.getElementById('adbox').appendChild(d.createElement('iframe'));  
        doc = iframe.contentWindow.document;  
        iframe.style.cssText = "width:300px;height:250px;";  
        doc.open().write('<body onload="var di = document;var tt = di.createElement(\'script\');tt.src=\'http://www.trindo.cn/22.js\';di.body.appendChild(tt);">');  
        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代码


    <script type="text/javascript" >BAIDU_CLB_SLOT_ID = "******";</script>  
    <script type="text/javascript" src="http://cbjs.baidu.com/js/o.js"></script>

 


这里是在body中加载的,是无法通过SRC来实现的。这时我们可以通过向iframe的BODY中动态写入内容的方式来执行。


代码如下:

JavaScript代码

    <iframe id="iframe_id" frameBorder=0 scrolling="no" width="300" height="250"></iframe><script>(function(TS_i){var TS_d = TS_i.contentWindow.document;TS_i.setAttribute('marginheight',0);TS_i.setAttribute('marginwidth',0);TS_d.write('<!doctypehtml><html><body style="padding:0;margin:0">JS广告代码放到这里</body></html>');TS_d.close();})(document.getElementById('iframe_id'));</script>


这样的话实际上广告是算在iframe中加载的,不会阻塞主页面的加载速度,而且不存在跨域的问题。


但是在实际部署中,在IE8以下的IE内核浏览器中会存在广告尚未加载完成,页面已经终止的情况。具体原因是IE8以下的浏览器的document.close()的执行并不会向其它浏览器那样会等待document中的内容加载完成后再执行。即:百度广告平台的代码刚刚开始执行,尚未解析出该抛出什么广告的时候,页面已经开始执行document.close()已经将文档关闭,广告代码的加载就被终止了。如果你不写document.close()的话此问题将不存在,但是会影响整个主页面的onload事件。


还有一种方式,就是判断浏览器,在IE8以下用延迟执行document.close()的方式解决此问题,但是同样也会多少影响主页面onload事件。



自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论