如何按需动态加载js文件
2024-08-01 00:36:02 215人阅读
JavaScript无非就是script标签引入页面,但当项目越来越大的时候,单页面引入N个js显然不行,合并为单个文件减少了请求数,但请求的文件体积却很大。这时候最好的做法就是按需引入,动态引入组件js和样式,文件load完成后调用callback,运行js。代码还是很简便的。塔河县臧清机械
1. 判断文件load完成。加载状态ie为onreadystatechange,其他为onload、onerror
02 | Res.onreadystatechange = function (){ |
03 | if (Res.readyState == ‘complete‘ || Res.readyState == ‘loaded‘ ){ |
04 | Res.onreadystatechange = null ; |
06 | _self.loadedUi[modelName] = true ; |
11 | Res.onload = function (){ |
14 | _self.loadedUi[modelName] = true ; |
16 | Res.onerror = function (){ |
17 | throw new Error( ‘res error:‘ + modelName+ ‘.js‘ ); |
2. 所有组件的命名最好保持一致,callback调用也比较方便。还可以根据需要增加参数比如: requires,依赖于那些文件;style,true || false,是否加载样式,等等。
3. 移除操作也可以有,移除script、style标签、delete组件
001 | ( function (window,undefined){ |
008 | version : window.config.version, |
009 | cssPath : window.config.resServer + ‘/css/v3/ui‘ , |
010 | jsPath : window.config.resServer + ‘/js/v2/ui‘ |
013 | readyStateChange : function (){ |
014 | var ua = navigator.userAgent.toLowerCase(); |
015 | return ua.indexOf( ‘msie‘ ) >= 0; |
017 | loadRes : function (modelName,prames,callback){ |
019 | var Res = document.createElement(prames.tagName); |
020 | for ( var k in prames){ |
022 | Res.setAttribute(k,prames[k],0); |
025 | document.getElementsByTagName( ‘head‘ )[0].appendChild(Res); |
027 | if ( this .readyStateChange()){ |
028 | Res.onreadystatechange = function (){ |
029 | if (Res.readyState == ‘complete‘ || Res.readyState == ‘loaded‘ ){ |
030 | Res.onreadystatechange = null ; |
032 | _self.loadedUi[modelName] = true ; |
036 | Res.onload = function (){ |
039 | _self.loadedUi[modelName] = true ; |
041 | Res.onerror = function (){ |
042 | throw new Error( ‘res error:‘ + modelName+ ‘.js‘ ); |
046 | removeUi : function (modelName){ |
050 | this .loadedUi[modelName] = false ; |
052 | var head = document.getElementsByTagName( ‘head‘ )[0]; |
053 | var model_js = document.getElementById( ‘J_model_‘ +modelName + ‘_js‘ ); |
054 | var model_css = document.getElementById( ‘J_model_‘ +modelName + ‘_css‘ ); |
055 | if (model_js && model_css){ |
056 | delete window.ui[modelName]; |
057 | head.removeChild(model_js); |
058 | head.removeChild(model_css); |
064 | loadUi : function (modelName,callback,setting){ |
068 | callback = callback || function (){}; |
069 | if ( this .loadedUi[modelName] == true ){ |
074 | var deafult_setting = { |
079 | for ( var key in setting){ |
080 | deafult_setting[key] = setting[key]; |
082 | deafult_setting[ ‘style‘ ] === true && this .loadRes(modelName,{ |
083 | id : ‘J_model_‘ +modelName + ‘_css‘ , |
088 | href : this .config.cssPath + ‘/‘ + modelName + ‘.css?v=‘ + this .config.version |
091 | deafult_setting[ ‘js‘ ] === true && this .loadRes(modelName,{ |
092 | id : ‘J_model_‘ +modelName + ‘_js‘ , |
095 | type : ‘text/javascript‘ , |
096 | src : this .config.jsPath + ‘/‘ + modelName + ‘.js?v=‘ + this .config.version |
098 | if (deafult_setting.requires.length > 0){ |
099 | for ( var i=0,len = deafult_setting.requires.length;i < len;i++){ |
100 | this .loadUi(deafult_setting.requires[i]); |
使用方法:
02 | window.bus.loadUi( ‘new_comment_feed‘ , function (){ |
03 | window.ui.new_comment_feed($( "#J_newsList" )); |
06 | requires:[ ‘emoticon‘ , ‘addFriend‘ ] |
10 | window.bus.loadUi( ‘yy‘ , function (){ |
11 | window.ui.yy(options); |
18 | window.bus.loadUi( ‘photoLightbox‘ , function (){ |
19 | window.ui.photoLightbox(options.urlAjaxGetFriendPhoto, options.urlCommentOtherPhoto,$( "#J_newsList" ),options.myUid,options.myName); |
如何按需动态加载js文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。