动态加载的javascript执行了两次

时间:2015-12-06 11:03:18

标签: 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(){});

加载的脚本 - one.js仅包含console.log('something...')语句,我得到两次

我可以确认:

  • 附加脚本 - .append( scr );只发生一次
  • 该脚本仅“物理”加载一次(从网络确认) 面板)

然而,相同的one.js,加载一次,附加一次,执行两次。

那么,有没有人知道发生了什么?

更新

我现在可以确认脚本在ajax加载之后立即执行,无论是否附加。这意味着纯加载javascript文件,像$.get('one.js') 一样简单,包含javascript代码。我不知道这是否应该发生,是否有解决方法......

2 个答案:

答案 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...

不执行收到的代码,因为它应该在第一时间。