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ć?

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!'); 
});

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>

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;

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);

4

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


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 );

1

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.