您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

重点解答动态加载JS脚本,一语道破

2025/10/19 1:54:42发布20次查看
用ajax开发网站,用ajax的时候,需要用到大量的js代码,而并是所有的代码都是要第一个载入的页面要用到,
所以很多的js代码动态载入比较合适,下面介绍了四种方法,在ajax开发中,第一种方法不合适,2,3,4方法,
本质上是一张方法,详细地的动态加载js方法如下:
1、直接document.write
<scrīpt language="javascrīpt"> document.write("<scrīpt src='test.js'><//scrīpt>"); </scrīpt>
2、动态改变已有scrīpt的src属性
<scrīpt src='' id="s1"></scrīpt> <scrīpt language="javascrīpt"> s1.src="test.js" </scrīpt>
3、动态创建scrīpt元素
<scrīpt> var ohead = document. getelementsbytagname ('head').item(0); var oscrīpt= document.createelement("scrīpt"); oscrīpt.type = "text/javascrīpt"; oscrīpt.src="test.js"; ohead.appendchild( oscrīpt); </scrīpt>
这三种方法都是异步执行的,也就是说,在加载这些脚本的同时,主页面的脚本继续运行,如果用以上的方法,那下面的代码将得不到预期的效果。
要动态加载的js脚本:a.js,以下是该文件的内容。
var str = "中国"; alert( "这是a.js中的变量:" + str );
主页面代码:
<scrīpt language="javascrīpt"> function loadjs( id, fileurl ) { var scrīpttag = document.getelementbyid( id ); var ohead = document.getelementsbytagname('head').item(0); var oscrīpt= document.createelement("scrīpt"); if ( scrīpttag ) ohead.removechild( scrīpttag ); oscrīpt.id = id; oscrīpt.type = "text/javascrīpt"; oscrīpt.src=fileurl ; ohead.appendchild( oscrīpt); } loadjs( "a.js" ); alert( "主页面动态加载a.js并取其中的变量:" + str ); </scrīpt>
上述代码执行后 a.js 的 alert 执行并弹出消息,
但是 主页面产生了错误,没有弹出对话框。原因是 'str' 未定义,为什么呢?因为主页面在取 str 的
时候 a.js 并没有完全加载成功。遇到需要同步执行脚本的时候,可以用下面的第四种方法。
4、原理:用xmlhttp取得要脚本的内容,再创建 scrīpt 对象。
注意:a.js必须用utf8编码保存,要不会出错。因为服务器与xml使用utf8编码传送数据。
主页面代码:
<scrīpt language="javascrīpt"> function gethttprequest() { if ( window.xmlhttprequest ) // gecko return new xmlhttprequest() ; else if ( window.activex object ) // ie return new activexobject("msxml2.xmlhttp") ; } function ajaxpage(sid, url){ var oxmlhttp = gethttprequest() ; oxmlhttp.onreadystatechange = function() { if ( oxmlhttp.readystate == 4 ) { if ( oxmlhttp.status == 200 || oxmlhttp.status == 304 ) { include js( sid, url, oxmlhttp.responsetext ); } else { alert( 'xml request error: ' + oxmlhttp.statustext + ' (' + oxmlhttp.status + ')' ) ; } } } oxmlhttp.open('get', url, true); oxmlhttp.send(null); } function includejs(sid, fileurl, source) { if ( ( source != null ) && ( !document.getelementbyid( sid ) ) ){ var ohead = document.getelementsbytagname('head').item(0); var oscrīpt = document.createelement( "scrīpt" ); oscrīpt.language = "javascrīpt"; oscrīpt.type = "text/javascrīpt"; oscrīpt.id = sid; oscrīpt.defer = true; oscrīpt.text = source; ohead.appendchild( oscrīpt ); } } ajaxpage( "scra", "b.js" ); alert( "主页面动态加载js脚本。"); alert( "主页面动态加载a.js并取其中的变量:" + str ); </scrīpt>
用ajax同步加载js代码,加载一个还好,两三个或者更多的时候,还是用异步加载比较快。
我使用第三种方法,每个js我都为其命名,当某个js加载完成后,则置一个代表其已经加载完成的标志。
//所有的js文件 var jsm = { page : false , dhtmlxtree : false , photo_tree : false }; function getjsm(f) { var reg = ///(/w+)/./; jf = f.match(reg); return jf[jf.length-1]; } function loadjs(js) { id = getjsm(js); var scrīptid = document.getelementbyid(id); var head = document.getelementsbytagname('head').item(0); if(scrīptid) { //head.removechild(id); } else { scrīpt = document.createelement('scrīpt'); scrīpt.src = js; scrīpt.type = 'text/javascrīpt'; scrīpt.id = id; head.appendchild(scrīpt); } } //js时候,判断jsm中,代表其模块的标识是否为true,如果为false,则尚未加载 loadjs("page.js") [js] view plain copy //所有的js文件 var jsm = { page : false , dhtmlxtree : false , photo_tree : false }; function getjsm(f) { var reg = ///(/w+)/./; jf = f.match(reg); return jf[jf.length-1]; } function loadjs(js) { id = getjsm(js); var scrīptid = document.getelementbyid(id); var head = document.getelementsbytagname('head').item(0); if(scrīptid) { //head.removechild(id); } else { scrīpt = document.createelement('scrīpt'); scrīpt.src = js; scrīpt.type = 'text/javascrīpt'; scrīpt.id = id; head.appendchild(scrīpt); } } //js时候,判断jsm中,代表其模块的标识是否为true,如果为false,则尚未加载 loadjs("page.js")
上面是我整理给大家的动态加载js脚本,希望今后会对大家有帮助。
相关文章:
javascript中遍历el表达式list集合中的值
如何在3f1c4e4b6b16bbbd69b2ee476dc4f83a2cacc6d41bbb37262a98f745aa00fbf0标签中一样可以使用el表达式
重写与多态的要点分析解答
以上就是重点解答动态加载js脚本,一语道破的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product