好吧,我有一个令人讨厌的情况,在我的自定义编写的脚本加载器中一切正常,除了正在加载的脚本是执行两次。
这里是完整的代码:
window._appCommons=window._appCommons||{};
$.loadScr = function(path, name, exportParam){
var df = $.Deferred();
if (! $( ['script[data-mname="', name, '"]'].join('') ).length ) {
window._appCommons[name] = {};
this.get(path).done(function(data){
for (var prop in exportParam) {
window._appCommons[name][prop] = exportParam[prop];
}
var scr = ['<script data-mname="' , name , '">' , data, '<\/script>'].join('');
$(document.getElementsByTagName('head')[0]).append( scr );
setTimeout(function(){ df.resolve(); },16);
});
}
return df;
}
$.loadScr('one.js', 'onejs', {'someKey':'someValue'}).done(function(){});
加载的脚本 - one.js
仅包含console.log('something...')
语句,我得到两次。
.append( scr );
只发生一次然而,相同的one.js
,加载一次,附加一次,执行两次。
那么,有没有人知道发生了什么?
我现在可以确认脚本在ajax加载之后立即执行,无论是否附加。这意味着纯加载javascript文件,像$.get('one.js')
一样简单,包含javascript代码。我不知道这是否应该发生,是否有解决方法......
答案 0 :(得分:0)
你可以尝试使用它吗?经过个人测试和使用的脚本:
function loadjscssfile (filename, filetype){
if (filetype=="js") { //if filename is a external JavaScript file
var fileref=document.createElement('script')
fileref.setAttribute("type","text/javascript")
fileref.setAttribute("src", filename)
}
else if (filetype=="css") { //if filename is an external CSS file
var fileref=document.createElement("link")
fileref.setAttribute("rel", "stylesheet")
fileref.setAttribute("type", "text/css")
fileref.setAttribute("href", filename)
}
if (typeof fileref!="undefined")
document.getElementsByTagName("head")[0].appendChild(fileref)
}
loadjscssfile("myscript.js", "js") //dynamically load and add this .js file
loadjscssfile("javascript.php", "js") //dynamically load "javascript.php" as a JavaScript file
loadjscssfile("mystyle.css", "css") ////dynamically load and add this .css file
答案 1 :(得分:0)
为了完整起见,我必须回答我自己的问题 - 这是jQuery.get()
默认设置的责任 - 有dataType
字段,如果没有明确设置,则会受到{{{}的限制。 1}} - 如果加载脚本Intelligent Guess
,实际上很难识别javascript代码并执行它。
我的问题已通过将jQuery
更改为:
this.get(path).done...
不执行收到的代码,因为它应该在第一时间。