怎么动态加载JavaScript文件
本文小编为大家详细介绍“怎么动态加载JavaScript文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么动态加载JavaScript文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
JavaScript 文件的动态加载是你必须拥有的非常有用的工具之一。它允许你通过将阻塞脚本从加载过程中移出(通常称为“延迟加载”)来优化网页性能,并仅在用户需要时加载脚本(通常称为“按需加载”)。如果您明智地使用此工具,它将大大提高你的页面性能。
配置让我们定义我们的示例模型,我们将从定义需要动态加载的远程文件开始。这是“remote.js
”文件的定义:
//thisisgoingtobeexecutedwhenscriptisloaded(function(){console.log("Remotescriptloaded");}());varsayHello=function(name){alert("Hello",name);}
在上面的代码中,我们定义了一个立即函数来跟踪文件加载。我们还定义了一个从主页面调用的自定义函数。
现在,这是我们的主要“index.htm
”页面。它只包含一个用于加载和测试文件的按钮。
<html><head></head><body><buttonid="loadButton">Loadscriptfile</button><scripttype="text/javascript">document.getElementById('loadButton').onclick=function(){//yourcodegoeshere};</script></body></html>无脑方法
加载 JavaScript 文件最直接的方法是在<script>
元素中引用它。动态加载这个文件最简单的方法就是动态加载这个元素!(你没有看到即将到来吗?是吗?)
让我们更新代码并查看实际结果:
document.getElementById("loadButton").onclick=function(){varscript=document.createElement("script");script.src="remote.js";script.onload=function(){sayHello("Mohammad");};//appendandexecutescriptdocument.documentElement.firstChild.appendChild(script);};
上面的代码简单地创建了一个<script>
元素并将src
这个元素的字段设置为我们文件的路径。然后它使用该appendChild()
函数将其附加到我们代码的第一个子<head>
元素元素。
现在,让我们重构上面的代码并稍微修改一下,以便能够在其他任何地方使用它:
/***Usedtoloadandexecutejavascriptfile.anbeusedcross-domainseamlessly.*@paramfileJSfilename*@paramcallbackSubscribetogetnotifiedwhenscriptfileisloaded**/functionrequire(file,callback){//createscriptelementvarscript=document.createElement("script");script.src=file;//monitorscriptloading//IE<7,doesnotsupportonloadif(callback){script.onreadystatechange=function(){if(script.readyState==="loaded"||script.readyState==="complete"){//noneedtobenotifiedagainscript.onreadystatechange=null;//notifyusercallback();}};//otherbrowsersscript.onload=function(){callback();};}//appendandexecutescriptdocument.documentElement.firstChild.appendChild(script);}document.getElementById("loadButton").onclick=function(){require("remote.js",function(){sayHello("Mohammad");});};
现在,你可以轻松调用require()JavaScript 路径和回调函数,以便在加载脚本时收到通知。
费力方法动态加载 JavaScript 文件的另一种方法是使用经典 HTTP 请求检索它。这是一个纯 JavaScript 调用,但它有很多缺点。让我们看看它的实际效果:
/***Usedtoloadandexecutejavascriptfile.Suffersfromsame-domainrestriction.*@paramfileJSfilename*@paramcallbackSubscribetogetnotifiedwhenscriptfileisloaded**/functionrequireXhr(file,callback){//objectinitializationconstxhr=newXMLHttpRequest();//subscribetorequesteventsxhr.onreadystatechange=function(){//readyState://0UNSENTClienthasbeencreated.open()notcalledyet.//1OPENEDopen()hasbeencalled.//2HEADERS_RECEIVEDsend()hasbeencalled,andheadersandstatusareavailable.//3LOADINGDownloading;responseTextholdspartialdata.//4DONETheoperationiscomplete.//whennotdone,returnif(xhr.readyState!==4){return;}//done,checkstatuscodeif(xhr.status!==200)//200=OK{return;}//nowthefileisloaded,//goandexecutethescripteval(xhr.responseText);//notifycallerif(callback){callback();}};//openconnectiontofilexhr.open("GET",file,true);//sendtherequestxhr.send();}document.getElementById("loadButton").onclick=function(){requireXhr("remote.js",function(){sayHello("Mohammad");});};
该代码非常简单且具有自我描述性。我们使用XMLHttpRequestobject
设置一个 HTML 请求,然后触发它。然后,我们监控其状态变化并相应地执行。
当我们执行上面的代码时,我们得到以下结果。我们可以在 DevTools 扩展中看到我们成功的 XHR 请求
另一方面,结果令人失望。我们能够成功运行脚本,并且 HTML 内容中没有脚本文件的线索,但是,由于eval()
的私有范围,我们无法调用加载的函数。
现在是最直接的延迟加载 JavaScript 文件的方式,jQuery 方式。jQuery 提供了一个名为getScript()
(它是ajax()
的简写)的函数来检索和加载 JavaScript 文件。这是代码:
/***UsedtoloadandexecuteJavaScriptfile.*@paramfileJSfilename*@paramcallbackSubscribetogetnotifiedwhenscriptfileisloaded**/functionrequireAjax(file,callback){jQuery.getScript(file,callback);}document.getElementById("loadButton").onclick=function(){requireAjax("remote.js",function(){sayHello("Mohammad");});};
虽然在内部jQuery.getScript()
使用XMLHttpRequest
,并且您可以在 DevTools 中的 XHR 列表中看到请求,但它不会遭受与XMLHttpRequest
.它比 raw
更容易使用和执行XMLHttpRequest
。
读到这里,这篇“怎么动态加载JavaScript文件”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。