Rufen Sie die Javascript-Funktion auf, nachdem das Skript geladen wurde

81

Ich habe eine HTML-Seite, auf der ich HTML dynamisch über ein Javascript wie unten anhänge

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

Ich möchte eine js-Funktion aufrufen, z. B. loadContent (); Sobald das obige Skript dynamisches HTML hinzufügt.

Kann mir jemand helfen, wie ich das machen kann?

Neeraj
quelle

Antworten:

140

Sie können dies erreichen, ohne das Javascript von head.js zu verwenden.

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
quelle
6
Zu onloadonload
Ihrer Information
3
Hinweis onloadstartet den Rückruf in der Minute, in der das Skript "LOADS" nicht, wenn es tatsächlich ausgeführt wurde, was enttäuschend ist
Ma Dude
@MaDude Können Sie sich dazu auf eine Dokumentation beziehen?
Kontrollanten
2
Der onloadHandler konnte möglicherweise nicht aufgerufen werden, wenn das Skript die Ausführung noch nicht abgeschlossen hat, da Javascript Single-Threaded ist. Dies bedeutet, dass der onloadHandler nur entweder VOR der Ausführung des Skriptstarts oder NACH Beendigung der Ausführung aufgerufen werden kann. Ich persönlich habe den früheren Fall noch nie gesehen ... NIEMALS. Wenn jemand einen reproduzierbaren Fall kennt, in dem der onloadHandler aufgerufen werden kann, bevor das Skript ausgeführt wird, teilen Sie uns dies bitte mit.
GetFree
Eine einfache Erweiterung zum Laden einer Reihe von Skripten: 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

Ich hatte das gleiche Problem ... Meine Lösung (ohne jQuery):

<script onload="loadedContent();" src ="/myapp/myCode.js"  ></script>
Didier68
quelle
2
Bitte beachten Sie: Dies ist nicht mit strengen CSPs kompatibel.
Bradley
13

Wenn Sie diesen Beitrag im Jahr 2020 lesen, sind Sie wahrscheinlich eher an Versprechen gewöhnt. Ein moderner Ansatz ist vorzuziehen, wenn entweder alle Ihre Zielbrowser ES6 unterstützen oder Sie eine Polyfüllung verwenden.

Diese Lösung funktioniert wie die Antwort von @JaykeshPatel , basiert jedoch auf 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');
  });

Sie können einige Kontextvariablen in Argumenten des resRückrufs übergeben, oder wenn Ihre Bibliothek ein globales Symbol importiert hat, können Sie dort darauf verweisen.

Da jQuery beispielsweise das $globale Symbol einführt , können Sie res($)einen lokalen Bereich dafür aufrufen und erstellen (ideal, wenn Sie TypeScript verwenden und nicht in jeder Datei eine Modulvariable deklarieren möchten, sondern auf diese Weise schreiben können const $ = await loadScript(..)).

Wenn Sie kein Argument übergeben möchten, können Sie Ihren Code einfach wie folgt kürzen:

script.onload = res;
script.onerror = rej;
Cristian Traìna
quelle
1
script.onLoad = res;// vereinfachen
Kunukn
1
@ Kunukn gibt es auch eine kürzere return new Promise(res => script.onload = res). Das Zuweisen einer Funktion zu onloadkann jedoch einfacher zu lesen sein und ermöglicht es Ihnen, ein Argument zur Lösung zu übergeben
Cristian Traìna
12

versuche so etwas

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_
quelle
4

Eigentlich könnten Sie einfach loadedContent()die letzte Zeile des Skripts einfügen, das Sie laden (was eine Art Konzept hinter JSONP ist).

David Fregoli
quelle
4

Meine Antwort ist eine Erweiterung der Antwort von Jaykesh Patel . Ich habe diesen Code implementiert, um mehrere Javascript zu laden . Hoffe das hilft jemandem:

// 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
quelle
1

Schauen Sie sich head.js an . Es wird das erreichen, wonach Sie suchen, und Rückrufe bereitstellen, wenn Ihre Datei (en) erfolgreich geladen und ausgeführt wurden.

CherryFlavourPez
quelle
-2
  $.getScript("your script",function () {
      "your action";
  });
Gaspar Junior
quelle