好吧,我遇到了一个令人讨厌的情况,在我的自定义编写的脚本加载器中一切正常,除了正在加载的脚本被执行两次之外。
这是完整的代码:
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(){});
Run Code Online (Sandbox Code Playgroud)
加载的脚本one.js仅包含console.log('something...')语句,我得到了两次。
.append( scr );仅发生一次而且,同样的one.js,加载一次,追加一次,执行两次。
那么,有人知道发生了什么事吗?
我现在可以确认脚本在 ajax 加载后立即执行,无论是否附加。这意味着纯粹加载 javascript 文件,就像$.get('one.js') 执行包含 javascript 代码一样简单。我不知道这种情况是否会发生,是否有解决方法......
为了完整起见,我必须回答我自己的问题 - 这是jQuery.get()默认设置的问题 - 有一个dataType字段,如果没有明确设置,就会受到所谓的影响Intelligent Guess- 并且在加载脚本的情况下jQuery实际上会费心识别 javascript 代码并执行它。
我的问题通过更改为解决this.get(path).done...:
this.ajax({
url: path,
dataType: 'text'
})
.done//...
Run Code Online (Sandbox Code Playgroud)
它不会执行收到的代码,因为它应该是第一位的。