zoukankan      html  css  js  c++  java
  • 通过iframe负载页面的js加载与执行

    近来在优化公司首页,首页用到了百度管家所生成的广告。 先贴出代码,这是之前的开发人员写的。

    <script type="text/javascript" src="http://cbjs.baidu.com/js/m.js"></script> 
        <script type="text/javascript">
        BAIDU_CLB_preloadSlots("16172","290788","18334","18335","22484","205385");
        </script>
        <div id="BAIDU_AD_1"><script type='text/javascript'>BAIDU_CLB_fillSlot('16172');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('16172');</script> 
        <script>document.getElementById("index_a1").appendChild(document.getElementById("BAIDU_AD_1"));</script>
        <div id="BAIDU_AD_sp"><script type='text/javascript'>BAIDU_CLB_fillSlot('290788');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('290788');</script> 
        <script>document.getElementById("index_sp").appendChild(document.getElementById("BAIDU_AD_sp"));</script>
        <div id="BAIDU_AD_3"><script type='text/javascript'>BAIDU_CLB_fillSlot('18334');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('18334');</script> 
        <script>document.getElementById("index_a3").appendChild(document.getElementById("BAIDU_AD_3"));</script>
        <div id="BAIDU_AD_4"><script type='text/javascript'>BAIDU_CLB_fillSlot('18335');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('18335');</script> 
        <script>document.getElementById("index_a4").appendChild(document.getElementById("BAIDU_AD_4"));</script>
        <div id="BAIDU_AD_5"><script type='text/javascript'>BAIDU_CLB_fillSlot('22484');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('22484');</script> 
        <script>document.getElementById("index_a5").appendChild(document.getElementById("BAIDU_AD_5"));</script>
        <div id="BAIDU_AD_6"><script type='text/javascript'>BAIDU_CLB_fillSlot('205385');</script></div>
        <script>BAIDU_CLB_prepareMoveSlot('205385');</script> 
        <script>document.getElementById("index_a6").appendChild(document.getElementById("BAIDU_AD_6"));</script>
        <script>tlog.fire("IndexBodyE", "IndexHeadB");</script>

    上面的代码很乱,大家不用细读, 这是百度广告管家生成的代码,也是生成同步广告的写法,这段代码执行起来非常慢,大家从代码上就可以看出,虽然是在页面的最后,但依然会阻塞后才能domready,

    我的第一反应就是考虑将这些代码全部放在domready之后再处理,但类似这些

    BAIDU_CLB_fillSlot的方法,都是document.write(), 如果放到domready后会直接清空文档,而且这些是第三方的js实现,也不能去修改实现。

    仔细分析了下代码,这些代码逻辑是通过百度第三方代码渲染出不同的广告位,在这里是6个,再appendChild到页面相应的位置。

    因为这些广告没有统计意义,只有被点击的意义,那可以在domready后创建一个iframe来并行加载这段代码,将渲染好的div广告 和 iframe广告再appendChild父页面。

    因为担心有些浏览器不支持iframe的节点appendChild到父页面,我用的是较安全的innerHTML, div广告没任何问题,但iframe广告问题挺多的,最麻烦的是ie系列下domain的bug,

    这个可以看我另外一篇博文,http://www.cnblogs.com/fang9159/archive/2012/09/12/iframe.html, 里面其实就是解决iframe问题 ,这样通过iframe来负载页面的方案已经实现。

    效果也不错, 减少了1.5秒左右的时间(1200万次浏览的平均值)。


    总结:
    1. iframe是html消耗最大的dom元素,用它需要谨慎,需要权衡利弊,像笔者这种情况当然是利大于弊。
    2. 在一个页面里,js是阻塞下载和执行的,可以通过iframe来缓解这种阻塞。
    3. 关系到第三方的广告优化,需要考虑到它自身有无统计意义,如果有统计意义,将它仍在iframe里面是肯定有问题的。需要寻求其他的方案。


  • 相关阅读:
    xshell使用密钥登陆服务器
    SQLyog使用隧道登陆数据库
    puttygen.exe生成ppk格式密钥
    xshell生成密钥对
    性能测试基础---jmeter函数二次开发
    Python:基础知识(二)
    异常点检测
    Python:numpy.newaxis
    三张图读懂机器学习:基本概念、五大流派与九种常见算法
    机器学习:样本集、验证集(开发集)、测试集
  • 原文地址:https://www.cnblogs.com/fang9159/p/youhua.html
Copyright © 2011-2022 走看看