validation外部脚本加载

我正在创build一个jQuery插件,我想validation外部脚本加载。 这是一个内部的Web应用程序,我可以保持脚本名称/位置一致(mysscript.js)。 这也是一个可以在页面上多次调用的ajaxy插件。

如果我可以validation脚本没有加载,我会加载它使用:

jQuery.getScript() 

我怎样才能validation脚本加载,因为我不希望相同的脚本不止一次加载在页面上? 这是否由于脚本的caching而不需要担心?

更新:我可能无法控制谁在我们的组织中使用此插件,并且可能无法强制该脚本不在页面中,但是该脚本名称始终与具有特定ID的页面在同一个位置同名。 我希望我可以使用脚本的名称来validation它的实际加载。

如果脚本在全局空间中创build了任何variables或函数,则可以检查它们的存在:

外部JS(在全球范围内) –

 var myCustomFlag = true; 

并检查是否已经运行:

 if (typeof window.myCustomFlag == 'undefined') { //the flag was not found, so the code has not run $.getScript('<external JS>'); } 

更新

你可以通过select所有的<script>元素并检查它们的src属性来检查有问题的<script>标记的存在:

 //get the number of `<script>` elements that have the correct `src` attribute var len = $('script').filter(function () { return ($(this).attr('src') == '<external JS>'); }).length; //if there are no scripts that match, the load it if (len === 0) { $.getScript('<external JS>'); } 

或者你可以直接将这个.filter()function.filter()入select器:

 var len = $('script[src="<external JS>"]').length; 

现在,我意识到如何做到这一点非常简单,这要归功于所有解决问题的答案。 我不得不放弃$ .getScript()为了指定脚本的来源…有时手动做事情是最好的。

 //great suggestion @Jasper var len = $('script[src*="Javascript/MyScript.js"]').length; if (len === 0) { alert('script not loaded'); loadScript('Javascript/MyScript.js'); if ($('script[src*="Javascript/MyScript.js"]').length === 0) { alert('still not loaded'); } else { alert('loaded now'); } } else { alert('script loaded'); } function loadScript(scriptLocationAndName) { var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = scriptLocationAndName; head.appendChild(script); } 

这个线程是在SO jquery标签FAQ的顶部,并有大量的方法来检查exisitng脚本

使用Google托pipe的jQuery的最佳方式,但是回退到我在Google上的托pipe库失败

很多关于各种方法的反馈

创build具有特定ID的脚本标签,然后检查该ID是否存在?

或者,循环检查脚本“src”的脚本标记,并确保这些脚本标记没有加载与你想避免的值相同的值。

编辑:下面的反馈,代码示例将是有用的:

 (function(){ var desiredSource = 'https://sitename.com/js/script.js'; var scripts = document.getElementsByTagName('script'); var alreadyLoaded = false; if(scripts.length){ for(var scriptIndex in scripts) { if(!alreadyLoaded && desiredSource === scripts[scriptIndex].src) { alreadyLoaded = true; } } } if(!alreadyLoaded){ // Run your code in this block? } })(); 

另一种检查外部脚本的方法是否被加载,你可以使用jquery的数据函数并存储validation标志。 例如:

 if(!$("body").data("google-map")) { console.log("no js"); $.getScript("https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initilize",function(){ $("body").data("google-map",true); },function(){ alert("error while loading script"); }); } } else { console.log("js already loaded"); } 

从上面合并几个答案到一个易于使用的function

 function GetScriptIfNotLoaded(scriptLocationAndName) { var len = $('script[src*="' + scriptLocationAndName +'"]').length; //script already loaded! if (len > 0) return; var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = scriptLocationAndName; head.appendChild(script); }