`
yesbi
  • 浏览: 17621 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

动态加载js文件的同步异步设置

阅读更多

动态加载js文件

一.直接加载

<body>

<div id="divId"></div>

<script>

     //1.动态创建js

     var rootObject=document.getElementById("divId");
     var oScript = document.createElement( "script" );
     oScript.type = "text/javascript";
     oScript.src = test.js; //test.js方法中有一个方法function test(){alert("test");}
     rootObject.appendChild(oScript);

 

     //2.调用js

     test();//在ie中不会出错,在firefox会出错,因为firefox默认为异步加载(在向服务器请求加载test.js文件的同时,继续向下执行了,调用test()方法,就自然找不到这个方法)

</script>

</body>

二.同步加载

<body>

<div id="divId"></div>

<script>

(function(){

 

Skip={

//获取XMLHttpRequest对象(提供客户端同http服务器通讯的协议)

getXmlHttpRequest:function ()
{
    if ( window.XMLHttpRequest ) // 除了IE外的其它浏览器
           return new XMLHttpRequest() ;
    else if ( window.ActiveXObject ) // IE
            return new ActiveXObject("MsXml2.XmlHttp") ;

},

 

 //导入内容
includeJsText :function (rootObject,jsText)
       {
        if ( rootObject != null ){
                var oScript = document.createElement( "script" );
             oScript.type = "text/javascript";
            //oScript.id = sId;
            //oScript.src = fileUrl;
            //oScript.defer = true;
            oScript.text = jsText;
            rootObject.appendChild(oScript);
            //alert(oScript.text);
        }
       },


 //导入文件
includeJsSrc :function (rootObject, fileUrl)
      {
        if ( rootObject != null ){
                var oScript = document.createElement( "script" );
             oScript.type = "text/javascript";
            oScript.src = fileUrl;
            rootObject.appendChild(oScript);
       }
      },

 

//同步加载
addJs:function(rootObject, url){

        var oXmlHttp = this.GetHttpRequest() ;
       
        oXmlHttp.onreadystatechange = function()  //其实当在第二次调用导入js时,因为在浏览器当中存在这个*.js文件了,它就不在访问服务器,也就不在执行这个方法了,这个方法也只有设置成异步时才用到
       
        {
            if ( oXmlHttp.readyState == 4 ) //当执行完成以后(返回了响应)所要执行的
       
            {
                if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ) //200有读取对应的url文件,404表示不存在这个文件
       
                {
       
                    includeJsSrc( rootObject, url);
                }
       
                else
       
                {
                    alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ;
       
                }
       
            }

         }
        
         //1.True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应,并且在open()方法当中有调用到onreadystatechange()这个方法。通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码,它表示服务器返回响应后才执行send()后面的方法.
         //2.同步执行oXmlHttp.send()方法后oXmlHttp.responseText有返回对应的内容,而异步还是为空,只有在oXmlHttp.readyState == 4时才有内容,反正同步的在oXmlHttp.send()后的操作就相当于oXmlHttp.readyState == 4下的操作,它相当于只有了这一种状态.
      oXmlHttp.open('GET', url, false); //url为js文件时,ie会自动生成 '<script src="*.js" type="text/javascript"></script>',ff不会 
      oXmlHttp.send(null);
      includeJsText(rootObject,oXmlHttp.responseText);
      }
}

};
 var rootObject=document.getElementById("divId");

 Skip.addJs(rootObject,"test.js")//test.js文件中含有funciotn test(){alert("test");}

test();//即使马上调用也不会出错了.


})();

 

</script>

</body>

 

总结:

1.ie动态加载js文件时,它默认就为同步,可以不用设置同步(也可直调用Skip.includeJsSrc())
2.ff动态加载js文件时,它默认为异步,要设置成同步,加载完直接调用才不会出错
3.无论ie还是ff在动态加载js内容时,没有请求服务器,不会存在异步问题
注:无论ie还是ff在页面加载js时(即执行整个页面),都是为同步的加载,除非设置script的属性defer="true"(此属性好像也只是对ie有效)

分享到:
评论

相关推荐

    JS 动态加载js文件和css文件 同步/异步的两种简单方式

    通过上述函数可以实现异步加载js文件,如果需要同步加载,可以通过将创建的script元素添加到页面的head部分之前来实现: ```javascript function loadJsFileSync(url,FileType,successCallback){ var script = ...

    jsloader 异步加载js文件

    **JSLoader:异步加载JavaScript文件** 在网页开发中,JavaScript文件的加载是网页渲染过程中的关键步骤。大型应用往往包含多个JS文件,这可能导致页面加载速度变慢,影响用户体验。为了解决这个问题,开发者引入了...

    同步加载JS文件Demo

    1. **动态`&lt;script&gt;`元素**:在"init.js"中,可以动态创建`&lt;script&gt;`元素,并设置其`src`属性为要加载的JavaScript文件。然后将这个元素插入到DOM中,浏览器会自动开始下载并执行该脚本。 2. **利用模块系统**:...

    同步异步动态引入js文件的几种方法总结

    有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 &lt;div id=divId&gt;&lt;/div&gt; [removed] 二.异步加载,并发执行,但引入js...

    QML中动态创建组件(同步/异步)的方法

    这两种JavaScript方法可以让你在运行时动态地创建组件,但需要注意的是,它们都在JavaScript上下文中进行,可能涉及线程同步问题。如果在非主线程中使用,记得使用异步方式,以避免阻塞UI。 异步加载组件是处理大...

    原生js上传文件,异步上传

    本主题将深入探讨如何使用原生JavaScript实现异步文件上传,包括利用`FormData`对象、Base64编码以及对图片进行压缩、变色和尺寸调整的方法。 一、异步上传 传统的文件上传通常依赖于表单的`&lt;form&gt;`元素,通过`...

    layui-tree实现Ajax异步请求后动态添加节点的方法

    接下来,我们引入 layui.js,这是一个包含 jQuery、layer(弹层组件)、form、element 等模块的 JavaScript 文件。在 JavaScript 部分,我们使用 layui 提供的工具方法来操作页面元素和事件。 layui.tree 初始化时...

    js异步加载代码

    在"asyLoad.js"这个文件中,我们可以预期它包含了一段用于实现JavaScript异步加载的代码。下面将详细介绍异步加载的原理和常见实现方法。 1. **异步加载的原理**: - 使用`&lt;script&gt;`标签的`async`属性:当`async`...

    js动态引入外部js脚本并获取里面的变量值.pdf

    在JavaScript编程中,有时我们需要在运行时动态地加载外部JavaScript文件,并且希望访问这些文件中的变量或函数。这种需求在处理模块化开发、按需加载或者处理第三方库时尤为常见。"js动态引入外部js脚本并获取里面...

    JavaScript文件的同步和异步加载的实现代码

    在前端开发中,JavaScript文件的加载方式主要分为同步加载和异步加载两种。下面详细介绍这两种加载方式的实现代码及其优缺点。 ### 同步加载 同步加载是最简单的加载方式,通过在HTML文件中使用标签引用JavaScript...

    js异步加载.docx

    - 通过动态创建`script`元素并将其插入DOM,可以实现异步加载和延迟加载,这种方式对脚本的来源没有同源策略的限制。 - 例如,Google Analytics和Google+ Badge的异步加载代码就使用了这种方法。 7. **优化策略**...

    动态加载JS脚本的4种方法.doc

    在Web开发中,动态加载JavaScript脚本是一种常见的优化策略,它允许在页面加载后根据需要按需加载脚本,从而提高页面性能和用户体验。本文将详细介绍四种动态加载JS脚本的方法,并探讨它们的工作原理和应用场景。 1...

    异步安全加载javascript文件的方法

    在互联网应用开发中,加载JavaScript文件是常见的需求,但同步加载可能会阻塞浏览器渲染,影响用户体验。异步加载JavaScript文件则可以解决这个问题,它允许页面继续加载其他资源,而不会被脚本加载所阻塞。本文将...

    javascript写的异步加载js文件函数(支持数组传参)

    异步加载JavaScript文件通常会使用`&lt;script&gt;`标签动态地向文档的`&lt;head&gt;`或`&lt;body&gt;`中添加脚本。当`&lt;script&gt;`标签被添加到DOM中时,浏览器会立即开始下载对应的脚本文件。由于`&lt;script&gt;`标签的下载和执行过程是同步...

    用ajax动态加载需要的js文件

    为了解决这个问题,文档建议使用AJAX同步请求远程JavaScript文件,而不是异步加载。这样做的好处是加载的JavaScript文件可以立即执行,而不必等待其他脚本完全加载完毕。文中讨论了路径问题,并建议以执行调用功能的...

    struts2实现多文件异步上传

    传统的文件上传是同步的,意味着用户提交表单后浏览器会等待服务器响应,直到所有文件上传完毕。而异步上传,通常使用Ajax技术,允许后台上传文件,用户界面则可以保持交互状态,显示上传进度。 1. **前端准备**: ...

Global site tag (gtag.js) - Google Analytics