Wywołaj funkcję javascript po załadowaniu skryptu

82

Mam stronę html, na której dynamicznie dołączam kod HTML za pomocą kodu JavaScript, jak poniżej

<script type="text/javascript" src="/myapp/htmlCode"></script>

Chcę wywołać funkcję js, np. LoadContent (); gdy powyższy skrypt doda dynamiczny html.

Czy ktoś może mi pomóc, jak mogę to zrobić?

Neeraj
źródło

Odpowiedzi:

141

możesz to osiągnąć bez używania javascript head.js.

function loadScript( url, callback ) {
  var script = document.createElement( "script" )
  script.type = "text/javascript";
  if(script.readyState) {  // only required for IE <9
    script.onreadystatechange = function() {
      if ( script.readyState === "loaded" || script.readyState === "complete" ) {
        script.onreadystatechange = null;
        callback();
      }
    };
  } else {  //Others
    script.onload = function() {
      callback();
    };
  }

  script.src = url;
  document.getElementsByTagName( "head" )[0].appendChild( script );
}


// call the function...
loadScript(pathtoscript, function() {
  alert('script ready!'); 
});
Jaykesh Patel
źródło
6
FYI: onloadjest ok dla wersji IE 9 i nowszych - więc samo ustawienie onloadjest teraz prawdopodobnie w porządku dla większości ludzi
Simon_Weaver
3
Uwaga onloadrozpocznie oddzwanianie w chwili, gdy skrypt "LOADS" zostanie uruchomiony, a nie wtedy, gdy zostanie faktycznie zakończony, co jest rozczarowujące
Ma Dude
@MaDude Czy możesz zapoznać się z dokumentami na ten temat?
kontrollanten
2
Nie onloadmożna wywołać procedury obsługi, gdy skrypt nie zakończył wykonywania, ponieważ JavaScript jest jednowątkowy. Oznacza to, że onloadprocedurę obsługi można było wywołać tylko PRZED rozpoczęciem wykonywania skryptu lub PO jego zakończeniu. Osobiście nigdy nie widziałem, żeby wystąpił pierwszy przypadek ... NIGDY. Jeśli ktoś wie o powtarzalnym przypadku, w którym onloadprocedurę obsługi można wywołać PRZED rozpoczęciem wykonywania skryptu, prosimy o poinformowanie nas.
GetFree
Proste rozszerzenie do ładowania tablicy skryptów: function loadScripts (urls, callback) {var counter = 0 for (var i=0; i<urls.length; i++) { loadScript(urls[i], function () { if (++counter === urls.length) { callback() } }) } }
sree
28

Miałem ten sam problem ... Moje rozwiązanie (bez jQuery):

<script onload="loadedContent();" src ="/myapp/myCode.js"  ></script>
Didier68
źródło
2
Uwaga: nie będzie to zgodne ze ścisłymi dostawcami CSP.
Bradley
14

Jeśli czytasz ten post w 2020 roku, prawdopodobnie jesteś bardziej przyzwyczajony do obietnic. Bardziej nowoczesne podejście jest preferowane, jeśli wszystkie przeglądarki docelowe obsługują ES6 lub używasz wypełnienia polyfill.

To rozwiązanie działa jak odpowiedź @JaykeshPatel , ale jest oparte na Promises:

// definition
function loadScript(scriptUrl) {
  const script = document.createElement('script');
  script.src = scriptUrl;
  document.body.appendChild(script);
  
  return new Promise((res, rej) => {
    script.onload = function() {
      res();
    }
    script.onerror = function () {
      rej();
    }
  });
}

// use
loadScript('http://your-cdn/jquery.js')
  .then(() => {
    console.log('Script loaded!');
  })
  .catch(() => {
    console.error('Script loading failed! Handle this error');
  });

Możesz przekazać niektóre zmienne kontekstowe w argumentach metody res wywołania zwrotnego lub, jeśli twoja biblioteka zaimportowała jakiś globalny symbol, możesz tam odwołać się do niego.

Na przykład, ponieważ jQuery wprowadza $symbol globalny, możesz wywołać res($)i utworzyć dla niego lokalny zasięg (idealne, jeśli używasz TypeScript i nie chcesz deklarować zmiennej modułu w każdym pliku, w ten sposób możesz pisać const $ = await loadScript(..)).

Jeśli nie chcesz przekazywać żadnego argumentu, możesz po prostu skrócić swój kod w następujący sposób:

script.onload = res;
script.onerror = rej;
Cristian Traìna
źródło
1
script.onLoad = res;//
simplify
1
@Kunukn jest też krótszy return new Promise(res => script.onload = res). Ale przypisanie funkcji do onloadmoże być łatwiejsze do odczytania i pozwala przekazać argument o rozwiązaniu
Cristian Traìna,
12

spróbuj czegoś takiego

var script = document.createElement('script');

if(script.readyState) {  //IE
script.onreadystatechange = function() {
  if ( script.readyState === "loaded" || script.readyState === "complete" ) {
    script.onreadystatechange = null;
    alert(jQuery);
  }
};
 } else{//others
script.onload = function() {
  alert(jQuery); 
}
}
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"
document.documentElement.appendChild(script);
socm_
źródło
4

właściwie możesz po prostu wstawić loadedContent()jako ostatnią linię skryptu, który ładujesz (co jest rodzajem koncepcji JSONP)

David Fregoli
źródło
4

Moja odpowiedź jest rozszerzeniem odpowiedzi Jaykesh Patel . Zaimplementowałem ten kod, aby załadować wiele javascript . Mam nadzieję, że to komuś pomoże:

// RECURSIVE LOAD SCRIPTS
function load_scripts( urls, final_callback, index=0 )
{
    if( typeof urls[index+1] === "undefined" )
    {
        load_script( urls[index], final_callback );
    }
    else
    {
        load_script( urls[index], function() {
            load_scripts( urls, final_callback, index+1 );
        } );
    }
}

// LOAD SCRIPT
function load_script( url, callback )
{
    var script = document.createElement( "script" );
    script.type = "text/javascript";
    if(script.readyState) // IE
    {
        script.onreadystatechange = function()
        {
            if ( script.readyState === "loaded" || script.readyState === "complete" )
            {
                script.onreadystatechange = null;
                callback();
            }
        };
    }
    else // Others
    {  
        script.onload = function() { callback(); };
    }
    script.src = url;
    document.getElementsByTagName( "head" )[0].appendChild( script );
    debug("javascript included: "+url);
}

// EXAMPLE  
var main = function()
{
    console.log("main function executed");
}
var js = [ "path/to/script-1", "path/to/script-2", "path/to/script-3" ];
load_scripts( js, main );
Marco Panichi
źródło
1

Sprawdź head.js . Osiągnie to, czego szukasz, zapewniając wywołania zwrotne, gdy plik (i) zostaną pomyślnie załadowane i wykonane.

CherryFlavourPez
źródło
-2
  $.getScript("your script",function () {
      "your action";
  });
Gaspar Junior
źródło