2008-08-21 21 views
130

Wie können Sie eine JavaScript-Datei zuverlässig und dynamisch laden? Dieser Wille kann verwendet werden, um ein Modul oder eine Komponente zu implementieren, die, wenn sie 'initialisiert' ist, die Komponente dynamisch alle benötigten JavaScript-Bibliotheksskripts bei Bedarf lädt.Laden Sie eine JavaScript-Datei dynamisch

Der Client, der die Komponente verwendet, muss nicht alle Bibliotheksskriptdateien laden (und manuell <script> Tags in ihre Webseite einfügen), die diese Komponente implementieren - nur die Hauptkomponentenskriptdatei.

Wie erreichen dies gängige JavaScript-Bibliotheken (Prototype, jQuery usw.)? Kombinieren diese Tools mehrere JavaScript-Dateien zu einer einzigen verteilbaren Build-Version einer Skriptdatei? Oder führen sie ein dynamisches Laden von zusätzlichen "Bibliotheks" -Skripten durch?

Ein Zusatz zu dieser Frage: gibt es eine Möglichkeit, das Ereignis zu behandeln, nachdem eine dynamisch enthaltene JavaScript-Datei geladen wurde? Prototyp hat document.observe für dokumentweite Ereignisse. Beispiel:

document.observe("dom:loaded", function() { 
    // initially hide all containers for tab content 
    $$('div.tabcontent').invoke('hide'); 
}); 

Was die verfügbaren Ereignisse für ein Skriptelement sind?

+0

möglich Duplikat [So schließen ein JavaScript-Datei in einer anderen JavaScript-Datei?] (Http://stackoverflow.com/questions/950087/how-to-include-a-javascript-file-in-another-javascript-file) – bjb568

Antwort

65

können Sie dynamische Script-Tags schreiben (mit Prototype):

new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"}); 

Das Problem hier ist, dass wir nicht wissen, wann die externe Skriptdatei vollständig geladen ist.

Wir wollen oft unseren abhängigen Code auf der nächsten Zeile und gerne so etwas wie schreiben:

if (iNeedSomeMore) { 
    Script.load("myBigCodeLibrary.js"); // includes code for myFancyMethod(); 
    myFancyMethod(); // cool, no need for callbacks! 
} 

Es ist eine intelligente Art und Weise Skript Abhängigkeiten, ohne die Notwendigkeit von Rückrufen zu injizieren. Sie haben einfach das Skript über einen synchronen AJAX-Request und eval das Skript auf globaler Ebene zu ziehen.

Wenn Sie Prototype verwenden die Script.load Methode sieht wie folgt aus:

var Script = { 
    _loadedScripts: [], 
    include: function(script) { 
     // include script only once 
     if (this._loadedScripts.include(script)) { 
      return false; 
     } 
     // request file synchronous 
     var code = new Ajax.Request(script, { 
      asynchronous: false, 
      method: "GET", 
      evalJS: false, 
      evalJSON: false 
     }).transport.responseText; 
     // eval code on global level 
     if (Prototype.Browser.IE) { 
      window.execScript(code); 
     } else if (Prototype.Browser.WebKit) { 
      $$("head").first().insert(Object.extend(
       new Element("script", { 
        type: "text/javascript" 
       }), { 
        text: code 
       } 
      )); 
     } else { 
      window.eval(code); 
     } 
     // remember included script 
     this._loadedScripts.push(script); 
    } 
}; 
+0

Was kann ich tun funktioniert es für domänenübergreifend? * (Laden von Skript von 'http://www.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu ff/userjs/aagmfunctions.js') * – user2284570

+0

@ user2284570 CORS http: //stackoverflow.com/questions/5750696/how-to-get-a-cross-origin-resource-sharing-cors-post-request-working –

+0

@Ciastopiekarz: Ich kontrolliere nicht "web.archive.org". – user2284570

8

Hier ist ein Beispielcode, den ich gefunden habe ... hat jemand einen besseren Weg?

function include(url) 
    { 
    var s = document.createElement("script"); 
    s.setAttribute("type", "text/javascript"); 
    s.setAttribute("src", url); 
    var nodes = document.getElementsByTagName("*"); 
    var node = nodes[nodes.length -1].parentNode; 
    node.appendChild(s); 
    } 
+0

Was kann ich tun, um g Und es funktioniert für Cross-Domain? * (Laden Skript von 'http://www.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu ff/userjs/aagmfunctions.js') * – user2284570

0

alle wichtigen JavaScript-Bibliotheken wie JScript, Prototyp, YUI haben Unterstützung für das Laden von Skriptdateien. Zum Beispiel in YUI, nachdem der Kern Laden können Sie den Kalender Steuer

var loader = new YAHOO.util.YUILoader({ 

    require: ['calendar'], // what components? 

    base: '../../build/',//where do they live? 

    //filter: "DEBUG", //use debug versions (or apply some 
         //some other filter? 

    //loadOptional: true, //load all optional dependencies? 

    //onSuccess is the function that YUI Loader 
    //should call when all components are successfully loaded. 
    onSuccess: function() { 
     //Once the YUI Calendar Control and dependencies are on 
     //the page, we'll verify that our target container is 
     //available in the DOM and then instantiate a default 
     //calendar into it: 
     YAHOO.util.Event.onAvailable("calendar_container", function() { 
      var myCal = new YAHOO.widget.Calendar("mycal_id", "calendar_container"); 
      myCal.render(); 
     }) 
    }, 

    // should a failure occur, the onFailure function will be executed 
    onFailure: function(o) { 
     alert("error: " + YAHOO.lang.dump(o)); 
    } 

}); 

// Calculate the dependency and insert the required scripts and css resources 
// into the document 
loader.insert(); 
+0

können Sie einen Blick darauf werfen unter dem Link: [antwort] (https://stackoverflow.com/questions/40808425/how-load-and-use-dynamical-javascript/45489130#45489130) – asmmahmud

18

Ich habe im Grunde die gleiche Sache zu laden Sie wie folgt vor, um die Sie Adam tat, aber mit einer Rutsche Modifikation um sicherzustellen, dass ich das Anhängen an das Head-Tag, um den Job zu erledigen. Ich habe einfach eine Include-Funktion (Code unten) erstellt, um sowohl Skript- als auch CSS-Dateien zu verarbeiten.

Diese Funktion überprüft auch, ob die Skript- oder CSS-Datei nicht bereits dynamisch geladen wurde. Es wird nicht nach handcodierten Werten gesucht und es gab vielleicht einen besseren Weg, dies zu tun, aber es diente dem Zweck.

function include(url, type){ 
    // First make sure it hasn't been loaded by something else. 
    if(Array.contains(includedFile, url)) 
     return; 

    // Determine the MIME-type 
    var jsExpr = new RegExp("js$", "i"); 
    var cssExpr = new RegExp("css$", "i"); 
    if(type == null) 
     if(jsExpr.test(url)) 
      type = 'text/javascript'; 
     else if(cssExpr.test(url)) 
      type = 'text/css'; 

    // Create the appropriate element. 
    var tag = null; 
    switch(type){ 
     case 'text/javascript' : 
      tag = document.createElement('script'); 
      tag.type = type; 
      tag.src = url; 
      break; 
     case 'text/css' : 
      tag = document.createElement('link'); 
      tag.rel = 'stylesheet'; 
      tag.type = type; 
      tag.href = url; 
      break; 
    } 

    // Insert it to the <head> and the array to ensure it is not 
    // loaded again. 
    document.getElementsByTagName("head")[0].appendChild(tag); 
    Array.add(includedFile, url); 
} 
+2

includeFile ist nicht definiert. –

+0

Ohne mehr Kontext als das Pickle, fürchte ich, ich habe keine Vorschläge. Der obige Code funktioniert wie er ist, er wurde direkt aus einem funktionierenden Projekt gezogen. – palehorse

+2

-1 Code läuft nicht. – Muhd

3

hat jemand einen besseren Weg?

Ich denke, nur das Hinzufügen des Skripts zum Körper wäre einfacher, als es zum letzten Knoten auf der Seite hinzuzufügen. Wie wäre es damit:

function include(url) { 
    var s = document.createElement("script"); 
    s.setAttribute("type", "text/javascript"); 
    s.setAttribute("src", url); 
    document.body.appendChild(s); 
} 
+0

Was kann ich tun, damit es für domänenübergreifende funktioniert? * (Lade Skript von 'http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu ff/userjs/aagmfunctions.js') * – user2284570

2

Die Technik, die wir bei der Arbeit ist es, die JavaScript-Datei mit Hilfe eines AJAX-Request und dann eval(), um die Rückkehr zu beantragen. Wenn Sie die Prototypbibliothek verwenden, unterstützen sie diese Funktionalität in ihrem Ajax.Request-Aufruf.

21

Ich benutzte ein much less complicated version recently mit jQuery:

<script src="scripts/jquery.js"></script> 
<script> 
    var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"]; 
    var $head = $("head"); 
    for (var i = 0; i < js.length; i++) { 
    $head.append("<script src=\"" + js[i] + "\"></scr" + "ipt>"); 
    } 
</script> 

Es hat gut funktioniert in jedem Browser ich es in getestet: IE6/7, Firefox, Safari, Opera.

Update: jQuery-less Version:

<script> 
    var js = ["scripts/jquery.dimensions.js", "scripts/shadedborder.js", "scripts/jqmodal.js", "scripts/main.js"]; 
    for (var i = 0, l = js.length; i < l; i++) { 
    document.getElementsByTagName("head")[0].innerHTML += ("<script src=\"" + js[i] + "\"></scr" + "ipt>"); 
    } 
</script> 
+22

Das ist großartig ... es sei denn, Sie versuchen, jquery zu laden. –

+1

Sieht so aus, als würde jQuery im Require-Plugin für eine zukünftige Version in jQuery Core rollen: http://plugins.jquery.com/project/require – Adam

+1

Eine noch bessere Methode, jQuery zu verwenden, ist '$ .getScript'. Siehe meine Antwort. – Muhd

3

i noch verwendet habe eine andere Lösung, die ich im Netz gefunden ... dies ist unter Creative und es prüft, ob die Quelle wurde vor inbegriffen um die Funktion aufrufen ...

Sie die Datei finden Sie hier: include.js

/** include - including .js files from JS - [email protected] - 2005-02-09 
** Code licensed under Creative Commons Attribution-ShareAlike License 
** http://creativecommons.org/licenses/by-sa/2.0/ 
**/    
var hIncludes = null; 
function include(sURI) 
{ 
    if (document.getElementsByTagName) 
    { 
    if (!hIncludes) 
    { 
     hIncludes = {}; 
     var cScripts = document.getElementsByTagName("script"); 
     for (var i=0,len=cScripts.length; i < len; i++) 
     if (cScripts[i].src) hIncludes[cScripts[i].src] = true; 
    } 
    if (!hIncludes[sURI]) 
    { 
     var oNew = document.createElement("script"); 
     oNew.type = "text/javascript"; 
     oNew.src = sURI; 
     hIncludes[sURI]=true; 
     document.getElementsByTagName("head")[0].appendChild(oNew); 
    } 
    } 
} 
+0

Was kann ich tun, damit es domänenübergreifend funktioniert? * (Laden von Skript aus 'http://www.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/ userjs/aagmfunctions.js') * – user2284570

3

Gerade über ein großartiges Feature in YUI 3 fand heraus (zum Zeitpunkt der in Preview-Version verfügbar zu schreiben). Sie können Abhängigkeiten zu YUI-Bibliotheken und zu "externen" Modulen (was Sie suchen) ohne zu viel Code einfügen: YUI Loader.

Es beantwortet auch Ihre zweite Frage in Bezug auf die Funktion wird, sobald das externe Modul geladen genannt.

Beispiel:

YUI({ 
    modules: { 
     'simple': { 
      fullpath: "http://example.com/public/js/simple.js" 
     }, 
     'complicated': { 
      fullpath: "http://example.com/public/js/complicated.js" 
      requires: ['simple'] // <-- dependency to 'simple' module 
     } 
    }, 
    timeout: 10000 
}).use('complicated', function(Y, result) { 
    // called as soon as 'complicated' is loaded 
    if (!result.success) { 
     // loading failed, or timeout 
     handleError(result.msg); 
    } else { 
     // call a function that needs 'complicated' 
     doSomethingComplicated(...); 
    } 
}); 

Arbeitete für mich perfekt und hat den Vorteil, Abhängigkeiten zu verwalten. Eine example with YUI 2 calendar finden Sie in der YUI-Dokumentation.

+0

Dies ist wahrscheinlich ideal, außer für YUI obszön groß für nur diese Funktionalität. – Muhd

2

jquery dies mit seiner .append für mich gelöst() Funktion - verwendet, um dieses die komplette jQuery UI-Paket

/* 
* FILENAME : project.library.js 
* USAGE : loads any javascript library 
*/ 
    var dirPath = "../js/"; 
    var library = ["functions.js","swfobject.js","jquery.jeditable.mini.js","jquery-ui-1.8.8.custom.min.js","ui/jquery.ui.core.min.js","ui/jquery.ui.widget.min.js","ui/jquery.ui.position.min.js","ui/jquery.ui.button.min.js","ui/jquery.ui.mouse.min.js","ui/jquery.ui.dialog.min.js","ui/jquery.effects.core.min.js","ui/jquery.effects.blind.min.js","ui/jquery.effects.fade.min.js","ui/jquery.effects.slide.min.js","ui/jquery.effects.transfer.min.js"]; 

    for(var script in library){ 
     $('head').append('<script type="text/javascript" src="' + dirPath + library[script] + '"></script>'); 
    } 

zu nutzen zu laden - in den Kopf Ihrer html/php/etc, nachdem Sie jquery.js Sie würden nur um diese eine Datei wie so zu laden, in der Gesamtheit Ihrer Bibliothek anhängt es auf den Kopf ...

<script type="text/javascript" src="project.library.js"></script> 
6

Wenn Sie importieren jQuery bereits geladen, sollten Sie $.getScript verwenden.

Dies hat einen Vorteil gegenüber den anderen Antworten hier, dass Sie ein in Callback-Funktion eingebaut haben (garantieren, dass das Skript geladen wird, bevor der abhängige Code ausgeführt wird) und Sie können Caching steuern.

1

Es gibt Skripte, die speziell für diesen Zweck entwickelt wurden.

yepnope.js in Modernizr gebaut und lab.js ist eine optimierte (aber weniger benutzerfreundliche Version

würde ich das nicht durch eine große Bibliothek wie jQuery oder Prototyp reccomend tun -., Weil einer der wichtigsten Vorteile von ein Script loader ist die Möglichkeit, Skripte früh zu laden - Sie sollten bis jquery warten müssen & all dOM-Elemente laden, bevor Sie eine Prüfung, um zu sehen, wenn Sie wollen nicht dynamisch einen Skript laden

13

eine ehrfürchtige Antwort

.
$.getScript("my_lovely_script.js", function(){ 


    alert("Script loaded and executed."); 
    // here you can use anything you defined in the loaded script 

}); 

https://stackoverflow.com/a/950146/671046

+2

Was kann ich tun, damit es domänenübergreifend funktioniert? * (Lade Skript von 'http://www.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStu ff/userjs/aagmfunctions.js') * – user2284570

38

Es gibt keinen Import/include/require in javascript, aber es gibt zwei Möglichkeiten, zu erreichen, was Sie wollen:

1 - Sie es mit einem AJAX-Aufruf laden können dann eval verwenden.

Dies ist der einfachste Weg, aber es ist aufgrund der Javascript-Sicherheitseinstellungen auf Ihre Domäne beschränkt, und die Verwendung von Eval öffnet die Tür zu Bugs und Hacks.

2 - Fügen Sie ein Skript-Tag mit der Skript-URL im HTML-Code hinzu.

Definitiv der beste Weg zu gehen. Sie können das Skript auch von einem fremden Server laden, und es ist sauber, wenn Sie den Browser-Parser zum Auswerten des Codes verwenden. Sie können das Tag im Kopf der Webseite oder am unteren Rand des Körpers platzieren.

Beide Lösungen werden hier diskutiert und illustriert.

Jetzt gibt es ein großes Problem, über das Sie wissen müssen. Dies bedeutet, dass Sie den Code remote laden. Moderne Webbrowser laden die Datei und führen das aktuelle Skript weiter aus, da sie alles asynchron laden, um die Leistung zu verbessern.

Wenn Sie diese Tricks direkt verwenden, können Sie den neu geladenen Code nicht in der nächsten Zeile verwenden, nachdem Sie ihn angefordert haben, da er noch geladen wird.

z.B: my_lovely_script.js enthält MySuperObject

var js = document.createElement("script"); 

js.type = "text/javascript"; 
js.src = jsFilePath; 

document.body.appendChild(js); 

var s = new MySuperObject(); 

Error : MySuperObject is undefined 

Dann Sie die Seite schlagen F5 neu laden. Und es funktioniert! Confusing ...

Was also zu tun?

Nun, Sie können den Hack verwenden, den der Autor in dem Link, den ich Ihnen gab, vorschlägt. Zusammengefasst verwendet er en-Ereignis, um eine Rückruffunktion auszuführen, wenn das Skript geladen wird. Sie können also den gesamten Code über die Remote-Bibliothek in die Callback-Funktion einfügen. E.G:

function loadScript(url, callback) 
{ 
    // adding the script tag to the head as suggested before 
    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 

    // then bind the event to the callback function 
    // there are several events for cross browser compatibility 
    script.onreadystatechange = callback; 
    script.onload = callback; 

    // fire the loading 
    head.appendChild(script); 
} 

Dann schreiben Sie den Code, den Sie, nachdem das Skript verwenden möchten, in einer Lambda-Funktion geladen wird:

var myPrettyCode = function() { 
    // here, do what ever you want 
}; 

Dann sind Sie alles, was laufen:

loadScript("my_lovely_script.js", myPrettyCode); 

Ok, Ich hab es geschafft. Aber es ist ein Schmerz, all das Zeug zu schreiben.

Nun, in diesem Fall, Sie wie immer den fantastischen frei jQuery Framework verwenden können, die Sie genau die gleiche Sache in einer Linie tun lassen:

$.getScript("my_lovely_script.js", function() { 
    alert("Script loaded and executed."); 
    // here you can use anything you defined in the loaded script 
}); 
+5

kann nicht glauben, wie unterschätzt dies Antwort ist. Vielen Dank. – naftalimich

+1

Ich wette, es ist, weil die Leute nicht gerne über die erste Zeile lesen, es sei denn, sie versprechen ihnen, dass sie reich werden, wenn sie "nur diese drei geheimen Schritte zum Erfolg folgen". – Costa

+0

Diese Antwort braucht mehr Up-Stimmen, nehmen Sie meine jetzt –

1

ich ein einfaches Modul geschrieben, das die Arbeit automatisiert von Importieren/Einschließen von Modulskripten in JavaScript. Probieren Sie es aus und bitte ersparen Sie sich ein Feedback! :) Ausführliche Erläuterung des Codes finden Sie in diesem Blog-Eintrag: http://stamat.wordpress.com/2013/04/12/javascript-require-import-include-modules/

var _rmod = _rmod || {}; //require module namespace 
_rmod.on_ready_fn_stack = []; 
_rmod.libpath = ''; 
_rmod.imported = {}; 
_rmod.loading = { 
    scripts: {}, 
    length: 0 
}; 

_rmod.findScriptPath = function(script_name) { 
    var script_elems = document.getElementsByTagName('script'); 
    for (var i = 0; i < script_elems.length; i++) { 
     if (script_elems[i].src.endsWith(script_name)) { 
      var href = window.location.href; 
      href = href.substring(0, href.lastIndexOf('/')); 
      var url = script_elems[i].src.substring(0, script_elems[i].length - script_name.length); 
      return url.substring(href.length+1, url.length); 
     } 
    } 
    return ''; 
}; 

_rmod.libpath = _rmod.findScriptPath('script.js'); //Path of your main script used to mark the root directory of your library, any library 


_rmod.injectScript = function(script_name, uri, callback, prepare) { 

    if(!prepare) 
     prepare(script_name, uri); 

    var script_elem = document.createElement('script'); 
    script_elem.type = 'text/javascript'; 
    script_elem.title = script_name; 
    script_elem.src = uri; 
    script_elem.async = true; 
    script_elem.defer = false; 

    if(!callback) 
     script_elem.onload = function() { 
      callback(script_name, uri); 
     }; 

    document.getElementsByTagName('head')[0].appendChild(script_elem); 
}; 

_rmod.requirePrepare = function(script_name, uri) { 
    _rmod.loading.scripts[script_name] = uri; 
    _rmod.loading.length++; 
}; 

_rmod.requireCallback = function(script_name, uri) { 
    _rmod.loading.length--; 
    delete _rmod.loading.scripts[script_name]; 
    _rmod.imported[script_name] = uri; 

    if(_rmod.loading.length == 0) 
     _rmod.onReady(); 
}; 

_rmod.onReady = function() { 
    if (!_rmod.LOADED) { 
     for (var i = 0; i < _rmod.on_ready_fn_stack.length; i++){ 
      _rmod.on_ready_fn_stack[i](); 
     }); 
     _rmod.LOADED = true; 
    } 
}; 

//you can rename based on your liking. I chose require, but it can be called include or anything else that is easy for you to remember or write, except import because it is reserved for future use. 
var require = function(script_name) { 
    var np = script_name.split('.'); 
    if (np[np.length-1] === '*') { 
     np.pop(); 
     np.push('_all'); 
    } 

    script_name = np.join('.'); 
    var uri = _rmod.libpath + np.join('/')+'.js'; 
    if (!_rmod.loading.scripts.hasOwnProperty(script_name) 
    && !_rmod.imported.hasOwnProperty(script_name)) { 
     _rmod.injectScript(script_name, uri, 
      _rmod.requireCallback, 
       _rmod.requirePrepare); 
    } 
}; 

var ready = function(fn) { 
    _rmod.on_ready_fn_stack.push(fn); 
}; 

// ----- USAGE ----- 

require('ivar.util.array'); 
require('ivar.util.string'); 
require('ivar.net.*'); 

ready(function(){ 
    //do something when required scripts are loaded 
}); 
2

Wenn Sie einen SYNC Skript Laden wollen, müssen Sie den Skripttext direkt in HTML HEAD Tag hinzuzufügen. Hinzufügen als es wird einen ASYNC Last auslösen. Verwenden Sie XHR, um Skripttext synchron aus einer externen Datei zu laden. Unterhalb einer schnellen Probe (es Teile von anderen Antworten in diesem und anderen Beiträgen verwendet):

/*sample requires an additional method for array prototype:*/ 

if (Array.prototype.contains === undefined) { 
Array.prototype.contains = function (obj) { 
    var i = this.length; 
    while (i--) { if (this[i] === obj) return true; } 
    return false; 
}; 
}; 

/*define object that will wrap our logic*/ 
var ScriptLoader = { 
LoadedFiles: [], 

LoadFile: function (url) { 
    var self = this; 
    if (this.LoadedFiles.contains(url)) return; 

    var xhr = new XMLHttpRequest(); 
    xhr.onload = function() { 
     if (xhr.readyState === 4) { 
      if (xhr.status === 200) { 
       self.LoadedFiles.push(url); 
       self.AddScript(xhr.responseText); 
      } else { 
       if (console) console.error(xhr.statusText); 
      } 
     } 
    }; 
    xhr.open("GET", url, false);/*last parameter defines if call is async or not*/ 
    xhr.send(null); 
}, 

AddScript: function (code) { 
    var oNew = document.createElement("script"); 
    oNew.type = "text/javascript"; 
    oNew.textContent = code; 
    document.getElementsByTagName("head")[0].appendChild(oNew); 
} 
}; 

/*Load script file. ScriptLoader will check if you try to load a file that has already been loaded (this check might be better, but I'm lazy).*/ 

ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js"); 
ScriptLoader.LoadFile("Scripts/jquery-2.0.1.min.js"); 
/*this will be executed right after upper lines. It requires jquery to execute. It requires a HTML input with id "tb1"*/ 
$(function() { alert($('#tb1').val()); }); 
2

Halten Sie es schön, kurz, einfach und wartbar! : Dieser Code

// 3rd party plugins/script (don't forget the full path is necessary) 
var FULL_PATH = '', s = 
[ 
    FULL_PATH + 'plugins/script.js'  // Script example 
    FULL_PATH + 'plugins/jquery.1.2.js', // jQuery Library 
    FULL_PATH + 'plugins/crypto-js/hmac-sha1.js',  // CryptoJS 
    FULL_PATH + 'plugins/crypto-js/enc-base64-min.js' // CryptoJS 
]; 

function load(url) 
{ 
    var ajax = new XMLHttpRequest(); 
    ajax.open('GET', url, false); 
    ajax.onreadystatechange = function() 
    { 
     var script = ajax.response || ajax.responseText; 
     if (ajax.readyState === 4) 
     { 
      switch(ajax.status) 
      { 
       case 200: 
        eval.apply(window, [script]); 
        console.log("library loaded: ", url); 
        break; 
       default: 
        console.log("ERROR: library not loaded: ", url); 
      } 
     } 
    }; 
    ajax.send(null); 
} 

// initialize a single load 
load('plugins/script.js'); 

// initialize a full load of scripts 
if (s.length > 0) 
{ 
    for (i = 0; i < s.length; i++) 
    { 
     load(s[i]); 
    } 
} 

] einfach eine kurze Funktionsbeispiel, dass konnte auf jedem für volle Unterstützung zusätzliche Feature-Funktionalität benötigen (oder gegeben) -Plattform.

0

Ich bin verloren in all diesen Proben aber heute habe ich benötigen eine externe Js von meinem Haupt-Js zu laden und ich tat dies:

document.write("<script src='https://www.google.com/recaptcha/api.js'></script>"); 
+0

Sie können einen Blick auf den Link: [Antwort] (https://stackoverflow.com/questions/40808425/how-load-and-use-dynamically-javascript/ 45489130 # 45489130) – asmmahmud

1

Here ist einfach mit Rückruf und IE-Unterstützung:

function loadScript(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); 
} 

loadScript("https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 

    //jQuery loaded 
    console.log('jquery loaded'); 

}); 
0

ich weiß, dass meine Antwort ist etwas für diese Frage zu spät, aber hier ist ein großer Artikel in www.html5rocks.com-Deep dive into the murky waters of script loading.

In diesem Artikel wird der Schluss gezogen, dass die beste Art und Weise in Bezug auf Browser-Unterstützung, dynamisch, ohne zu blockieren Inhalt Rendering JavaScript-Datei zu laden ist die folgende Art und Weise:

Betrachtet man script1.js, script2.js, script3.js, script4.js dann können Sie benannte vier Skripte haben tun es mit Anwendung async = false:

[ 
    'script1.js', 
    'script2.js', 
    'script3.js', 
    'script4.js' 
].forEach(function(src) { 
    var script = document.createElement('script'); 
    script.src = src; 
    script.async = false; 
    document.head.appendChild(script); 
}); 

, jetzt Spec sagt: Download zusammen, führen, sobald alle Download um.

Firefox < 3.6, sagt Opera: Ich habe keine Ahnung, was diese "async" Sache ist, aber es passiert einfach, dass ich Skripte über JS hinzugefügt in der Reihenfolge, die sie hinzugefügt werden.

Safari 5.0 sagt: Ich verstehe "async", aber verstehe nicht, es auf "falsch" mit JS einzustellen. Ich werde Ihre Skripte ausführen, sobald sie landen, in welcher Reihenfolge auch immer.

IE < 10 sagt: Keine Ahnung über "async", aber es gibt einen Workaround mit "onreadystatechange".

Alles andere sagt: Ich bin dein Freund, wir werden dies nach dem Buch tun.

nun der vollständige Code mit IE < 10 Abhilfe:

var scripts = [ 
    'script1.js', 
    'script2.js', 
    'script3.js', 
    'script4.js' 
]; 
var src; 
var script; 
var pendingScripts = []; 
var firstScript = document.scripts[0]; 

// Watch scripts load in IE 
function stateChange() { 
    // Execute as many scripts in order as we can 
    var pendingScript; 
    while (pendingScripts[0] && pendingScripts[0].readyState == 'loaded') { 
    pendingScript = pendingScripts.shift(); 
    // avoid future loading events from this script (eg, if src changes) 
    pendingScript.onreadystatechange = null; 
    // can't just appendChild, old IE bug if element isn't closed 
    firstScript.parentNode.insertBefore(pendingScript, firstScript); 
    } 
} 

// loop through our script urls 
while (src = scripts.shift()) { 
    if ('async' in firstScript) { // modern browsers 
    script = document.createElement('script'); 
    script.async = false; 
    script.src = src; 
    document.head.appendChild(script); 
    } 
    else if (firstScript.readyState) { // IE<10 
    // create a script and add it to our todo pile 
    script = document.createElement('script'); 
    pendingScripts.push(script); 
    // listen for state changes 
    script.onreadystatechange = stateChange; 
    // must set src AFTER adding onreadystatechange listener 
    // else we’ll miss the loaded event for cached scripts 
    script.src = src; 
    } 
    else { // fall back to defer 
    document.write('<script src="' + src + '" defer></'+'script>'); 
    } 
} 

ein paar Tricks und minification später, ist es 362 Bytes

!function(e,t,r){function n(){for(;d[0]&&"loaded"==d[0][f];)c=d.shift(),c[o]=!i.parentNode.insertBefore(c,i)}for(var s,a,c,d=[],i=e.scripts[0],o="onreadystatechange",f="readyState";s=r.shift();)a=e.createElement(t),"async"in i?(a.async=!1,e.head.appendChild(a)):i[f]?(d.push(a),a[o]=n):e.write("<"+t+' src="'+s+'" defer></'+t+">"),a.src=s}(document,"script",[ 
    "//other-domain.com/1.js", 
    "2.js" 
])