2013-04-26 40 views
68

我試圖按順序加載一組腳本,但onload事件並未對我開火。嘗試觸發腳本標記上的onload事件

var scripts = [ 
     '//cdnjs.cloudflare.com/ajax/libs/less.js/1.3.3/less.min.js', 
     '//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0-rc.3/handlebars.min.js', 
     MK.host+'/templates/templates.js' 
    ]; 

    function loadScripts(scripts){ 
     var script = scripts.shift(); 
     var el = document.createElement('script'); 
     el.src = script; 
     el.onload = function(script){ 
      console.log(script + ' loaded!'); 
      if (scripts.length) { 
       loadScripts(scripts); 
      } 
      else { 
       console.log('run app'); 
       MK.init(); 
      } 
     }; 

     $body.append(el); 
    } 

    loadScripts(scripts); 

我猜想像el.onload這樣的本地事件在jQuery被用來追加元素到DOM時不會觸發。如果我使用原生document.body.appendChild(el),則按預期啓動。

+0

訪問:thi鏈接:http://stackoverflow.com/questions/4845762/onload-handler-for-script-tag-in-internet-explorer 這是使用富爾 – Jitesh 2013-04-26 07:26:41

回答

91

你應該後設置src屬性onload事件,f.ex:

el.onload = function() { //... 
el.src = script; 

你也應該前的腳本追加到DOM 連接的onload事件:

$body.append(el); 
el.onload = function() { //... 
el.src = script; 

請記住,您需要檢查readystate以獲得IE支持。如果您使用的是jQuery,您也可以嘗試使用getScript()方法:http://api.jquery.com/jQuery.getScript/

+0

@chovy錯字,編輯... – David 2013-04-26 07:36:45

+7

實際上不解決它。但是,如果我只是使用'document.body.appendChild(el)'而不是$('body')。append(el);那麼onload事件如預期的那樣觸發。 – chovy 2013-04-26 07:37:57

+0

我不知道如何「修復」你的代碼,但最好的做法是將腳本追加到'',附加'onload'處理程序,然後附加'src'屬性。以該順序。 – David 2013-04-26 07:40:05