动态加载的javascript执行两次

Mil*_*vić 6 javascript

好吧,我遇到了一个令人讨厌的情况,在我的自定义编写的脚本加载器中一切正常,除了正在加载的脚本被执行两次之外

这是完整的代码:

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 代码一样简单。我不知道这种情况是否会发生,是否有解决方法......

Mil*_*vić 2

为了完整起见,我必须回答我自己的问题 - 这是jQuery.get()默认设置的问题 - 有一个dataType字段,如果没有明确设置,就会受到所谓的影响Intelligent Guess- 并且在加载脚本的情况下jQuery实际上会费心识别 javascript 代码并执行它。

我的问题通过更改为解决this.get(path).done...

    this.ajax({
      url: path,
      dataType: 'text'
    })
    .done//...
Run Code Online (Sandbox Code Playgroud)

它不会执行收到的代码,因为它应该是第一位的。