2013-05-24 16 views
9

Jak można uzyskać, aby wywołanie zwrotne nie działało, dopóki skrypt nie zostanie faktycznie dołączony do dokumentu?Opóźnienie oddzwaniania, dopóki skrypt nie zostanie dodany do dokumentu?

function addScript(filepath, callback){ 
    if (filepath) { 
     var fileref = document.createElement('script'); 
     fileref.setAttribute("type","text/javascript"); 
     fileref.setAttribute("src", filepath); 
     if (typeof fileref!="undefined") 
      document.getElementsByTagName("head")[0].appendChild(fileref); 
    } 
    if (callback) { 
     callback(); 
    } 
} 

Odpowiedz

12

W idealnym świecie, można użyć właściwości znacznika <script />onload;

function addScript(filepath, callback){ 
    if (filepath) { 
     var fileref = document.createElement('script'); 

     fileref.onload = callback; 

     fileref.setAttribute("type","text/javascript"); 
     fileref.setAttribute("src", filepath); 

     if (typeof fileref!="undefined") 
      document.getElementsByTagName("head")[0].appendChild(fileref); 
    } 
} 

Jednak, this doesn't work in IE, więc mega-h4x są wymagane;

function addScript(filepath, callback) { 
     if (filepath) { 
      var fileref = document.createElement('script'); 
      var done = false; 
      var head = document.getElementsByTagName("head")[0]; 

      fileref.onload = fileref.onreadystatechange = function() { 
       if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) { 
        done = true; 

        callback(); 

        // Handle memory leak in IE 
        fileref.onload = fileref.onreadystatechange = null; 
        if (head && fileref.parentNode) { 
         head.removeChild(fileref); 
        } 
       } 
      }; 

      fileref.setAttribute("type", "text/javascript"); 
      fileref.setAttribute("src", filepath); 

      head.appendChild(fileref); 
     } 
    } 

FWIW Twój if (typeof fileref != "undefined") był zbędny, ponieważ będzie ona zawsze oceniać true, więc można po prostu zrobić head.appendChild(fileref); bezpośrednio, jak w moim przykładzie.

-1

Najłatwiej będzie określić jakąś widoczną callback() funkcję, która będzie działać w dynamicznie zawarte skrypt, na końcu.

+1

nie mogę dotknąć dynamicznie dołączonego skryptu. – dezman

2

co:

var myParticularCallback = function() { 
    // do something neat ... 
} 

..... your code 

var fileref = document.createElement('script'); 
fileref.setAttribute("type","text/javascript"); 

fileref.onload = myParticularCallback; 

if (typeof fileref!="undefined") 
    document.getElementsByTagName("head")[0].appendChild(fileref); 

// after all has set, laod the script and wait for onload event: 
fileref.setAttribute("src", filepath); 
+0

Naprawdę podoba mi się rozwiązanie do używania fileref.onload = myParticularCallback –

Powiązane problemy