Danke, ich habe gerade die Methode writeScript übernommen und sie etwas gestrafft. Überraschend, wie oft ich asynchron lade und immer die genaue Art und Weise vergesse, das Skriptelement usw. zu erstellen. Danke!
Vielleicht gut zu erwähnen, dass „addEventListener“ in IE8 oder niedriger nicht unterstützt wird. Sie verwenden „attachEvent“. Sie können IE so unterstützen
if(s.addEventListener) { s.addEventListener(‘load’, function (e) { self.loaded(e); }, false); } else if(s.attachEvent) { s.attachEvent(‘load’, function (e) { self.loaded(e); }
}
Aber das Skript-Tag hat kein ‚load‘-Ereignis. Sie sollten ‚onreadystatechange‘ verwenden, um das Laden der Skripte zu überwachen. if (s.addEventListener) { s.addEventListner(‘load’, function(e) { //callback hier }, false); } else { s.onreadystatechange = function() { if (s.readyState in {loaded: 1, complete: 1}) { //callback hier
}
};
}
@jockchou: Ihr Kommentar zur Verwendung von onreadystatechange anstelle des Auslösers für den Callback hat mir geholfen, dies in IE8 zum Laufen zu bringen. Danke!
Ich betreibe einen lokalen Server, während ich die Verwendung des JQuery.UI.Datepicker-Plugins untersuche. Das Plugin erfordert einige Patches und ich möchte den Lade-Code der Datepicker-Bibliothek und die Patches in ein Wrapper-Skript packen, das die Seite, die das Datepicker-Plugin verwendet, einbinden kann. So dass das Wrapper-Skript die Bibliothek laden kann. Ich versuche, den JQuery.getScript-Aufruf zu verwenden, stoße aber auf den folgenden Fehler
jquery-1.12.4.js:10254 XMLHttpRequest cannot load file:///D:/Users/.../Datepicker Widget.js?_=1469194829595.
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.send @ jquery-1.12.4.js:10254
Datepicker Widget.html:118 Uncaught TypeError: $(...).datepicker is not a function
Ich glaube, das liegt daran, dass meine Website lokal gehostet wird und daher kein HTTP- oder HTTPS-Protokollpräfix in der URL der Datei hat, die ich laden möchte. Gibt es für lokale Einbindungen eine einfache Möglichkeit, dies zum Laufen zu bringen, ohne dass ich meine eigene Domain registrieren muss? Nachdem ich mit dem Testen des Datepickers fertig bin, wird mein Code auf einen Server verschoben, der seine eigene HTTP-URL hat, sodass dies wahrscheinlich kein Problem mehr sein wird, aber in der Zwischenzeit oder für andere lokale Projekte möchte ich besser verstehen, wie das alles funktioniert.
Der success Callback für jQuery.getScript wird aufgerufen, sobald das Skript heruntergeladen wurde, aber es ist nicht garantiert, dass er nach der Ausführung des Skripts aufgerufen wird.
Ankit G., ich wäre auch sehr daran interessiert, das von Ihnen gelöschte Repository zu sehen.
Wüssten Sie oder jemand anderes, ob diese Lösungen, Ihre und die $.getScript, JavaScript-Dateien und auch CSS-Dateien laden werden.
Außerdem, da ich neu in all dem bin, lassen Sie mich bitte fragen, wann ich die Callback-Funktion verwenden soll. Wenn ich diese Methoden verwende, um eine JavaScript-Datei im Kopfbereich der Seite einzubinden, führe ich sie dann mit dem Callback aus, vielleicht mit einem document.ready-Ereignis, oder muss die Ausführung im Body der Seite erfolgen?
Ich versuche derzeit, die JQuery.UI Datepicker-Bibliothek und einige Patch-Funktionen zu laden, die einige der grundlegenden Verhaltensweisen von Datepicker modifizieren. Dies erfordert, dass ich die Bibliothek und die Patch-Funktionen ausführe, bevor ich sie in meinem Seiten-Body zum Erstellen der Datepicker-Steuerelemente verwenden kann. In meinem aktuellen Code werden die Datepicker-Bibliothek und JQuery mit Tags im Seitenkopf geladen, aber die Patch-Funktionen sind in Tags im Seiten-Body, wo sie erstellt und dann ausgeführt werden. Ich möchte die Ladefunktion der Datepicker-Bibliothek und die Patch-Funktionen in eine Wrapper-Skriptdatei packen. Das Skript könnte wahrscheinlich normal mit dem Tag im Seitenkopf geladen werden. Das Ganze würde ungefähr so aussehen:
<!--
The following wrapper files contains the $.getScript( 'JQuery.UI.Datepicker URL') and
several patch functions that modify the datepicker object created by the getScript loader.
-->
<!-- Code that uses the patched datepicker -->
:
The wrapper would be structured something like:
/* *********************************************************
Using $.getScript to load the JQuery.UI.Datepicker and
then defining the patch functions needed to modify the
datepickers behaviours.
********************************************************* */
$.getScript( 'JQuery.UI.Datepicker URL' ...
/* Define Patch functions */
function Patch1() { ... }
:
function PatchN() { ... }
/* Execute Patch functions */
Patch1();
:
PatchN();
/* End of Wrapper file */
Wenn es so strukturiert ist und die Datepicker- und Patch-Funktionen Code haben, der über die Callback-Funktion ausgeführt wird, würde das funktionieren?
Alternativ könnte ich die Funktionen mit dem document.ready-Ereignis aufrufen und Code in der Wrapper-Datei verwenden, wenn das einfacher ist.
Ich bitte Sie, diese Codes mit Demo zur Verfügung zu stellen… das würde uns sehr helfen..
Vielen Dank für Ihre Hilfe.
Danke, ich habe gerade die Methode writeScript übernommen und sie etwas gestrafft. Überraschend, wie oft ich asynchron lade und immer die genaue Art und Weise vergesse, das Skriptelement usw. zu erstellen. Danke!
Vielleicht gut zu erwähnen, dass „addEventListener“ in IE8 oder niedriger nicht unterstützt wird.
Sie verwenden „attachEvent“. Sie können IE so unterstützen
if(s.addEventListener) {
s.addEventListener(‘load’, function (e) { self.loaded(e); }, false);
} else if(s.attachEvent) {
s.attachEvent(‘load’, function (e) { self.loaded(e); }
}
Oder wenn Sie jQuery verwenden, können Sie
jQuery(s).load(function(e) { self.loaded(e); });
verwenden: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener)”
Aber das Skript-Tag hat kein ‚load‘-Ereignis. Sie sollten ‚onreadystatechange‘ verwenden, um das Laden der Skripte zu überwachen.
if (s.addEventListener) {
s.addEventListner(‘load’, function(e) {
//callback hier
}, false);
} else {
s.onreadystatechange = function() {
if (s.readyState in {loaded: 1, complete: 1}) {
//callback hier
}
};
}
//etwas Code
function loadScript(url, callback){
var script = document.createElement(“script”);
script.type = “text/javascript”;
script.charset = “utf8”;
if (script.readyState) {//IE
script.onreadystatechange = function() {
if (script.readyState == ‘loaded’ || script.readyState == ‘complete’) {
script.onreadystatechange = null;
if (typeof callback === ‘function’) {
callback();
}
}
};
} else {//andere Browser
script.onload = function() {
script.onload = null;
if (typeof callback === ‘function’) {
callback();
}
};
}
script.src = url;
document.getElementsByTagName(“head”)[0].appendChild(script);
}
@jockchou: Ihr Kommentar zur Verwendung von onreadystatechange anstelle des Auslösers für den Callback hat mir geholfen, dies in IE8 zum Laufen zu bringen. Danke!
Dieses Snippet hat für mich nicht wirklich funktioniert, aber jQuery.getScript() funktioniert einwandfrei! https://api.jquery.com/jquery.getscript/
Ich betreibe einen lokalen Server, während ich die Verwendung des JQuery.UI.Datepicker-Plugins untersuche. Das Plugin erfordert einige Patches und ich möchte den Lade-Code der Datepicker-Bibliothek und die Patches in ein Wrapper-Skript packen, das die Seite, die das Datepicker-Plugin verwendet, einbinden kann. So dass das Wrapper-Skript die Bibliothek laden kann. Ich versuche, den JQuery.getScript-Aufruf zu verwenden, stoße aber auf den folgenden Fehler
Ich glaube, das liegt daran, dass meine Website lokal gehostet wird und daher kein HTTP- oder HTTPS-Protokollpräfix in der URL der Datei hat, die ich laden möchte. Gibt es für lokale Einbindungen eine einfache Möglichkeit, dies zum Laufen zu bringen, ohne dass ich meine eigene Domain registrieren muss? Nachdem ich mit dem Testen des Datepickers fertig bin, wird mein Code auf einen Server verschoben, der seine eigene HTTP-URL hat, sodass dies wahrscheinlich kein Problem mehr sein wird, aber in der Zwischenzeit oder für andere lokale Projekte möchte ich besser verstehen, wie das alles funktioniert.
Der
successCallback fürjQuery.getScriptwird aufgerufen, sobald das Skript heruntergeladen wurde, aber es ist nicht garantiert, dass er nach der Ausführung des Skripts aufgerufen wird.Ein kleiner fortgeschrittener JavaScript-Loader, basierend auf dieser Technik, aber mit der zusätzlichen Funktion, dass ein Skript in keinem Fall erneut heruntergeladen wird. https://github.com/ankit31894/javascript-asynchronous-loader
Nun, das ist schade, das ist eine 404. Ist es ein privates Repository? Wäre interessant zu sehen, wie Sie das gemacht haben :)
@Tony Ich habe dieses Repository gelöscht, aber wenn Sie möchten, kann ich es für Sie neu posten. Möchten Sie es immer noch?
Hallo Ankit, das wäre gut, danke :) Warum verwenden Sie nicht GitHub Gist?
@Ankit Bitte posten Sie das Repo neu. Es wäre sehr nützlich
Ankit G., ich wäre auch sehr daran interessiert, das von Ihnen gelöschte Repository zu sehen.
Wüssten Sie oder jemand anderes, ob diese Lösungen, Ihre und die $.getScript, JavaScript-Dateien und auch CSS-Dateien laden werden.
Außerdem, da ich neu in all dem bin, lassen Sie mich bitte fragen, wann ich die Callback-Funktion verwenden soll. Wenn ich diese Methoden verwende, um eine JavaScript-Datei im Kopfbereich der Seite einzubinden, führe ich sie dann mit dem Callback aus, vielleicht mit einem document.ready-Ereignis, oder muss die Ausführung im Body der Seite erfolgen?
Ich versuche derzeit, die JQuery.UI Datepicker-Bibliothek und einige Patch-Funktionen zu laden, die einige der grundlegenden Verhaltensweisen von Datepicker modifizieren. Dies erfordert, dass ich die Bibliothek und die Patch-Funktionen ausführe, bevor ich sie in meinem Seiten-Body zum Erstellen der Datepicker-Steuerelemente verwenden kann. In meinem aktuellen Code werden die Datepicker-Bibliothek und JQuery mit Tags im Seitenkopf geladen, aber die Patch-Funktionen sind in Tags im Seiten-Body, wo sie erstellt und dann ausgeführt werden. Ich möchte die Ladefunktion der Datepicker-Bibliothek und die Patch-Funktionen in eine Wrapper-Skriptdatei packen. Das Skript könnte wahrscheinlich normal mit dem Tag im Seitenkopf geladen werden. Das Ganze würde ungefähr so aussehen:
Wenn es so strukturiert ist und die Datepicker- und Patch-Funktionen Code haben, der über die Callback-Funktion ausgeführt wird, würde das funktionieren?
Alternativ könnte ich die Funktionen mit dem document.ready-Ereignis aufrufen und Code in der Wrapper-Datei verwenden, wenn das einfacher ist.
Vielen Dank,
Howard Brown
Beachten Sie, dass dies viel langsamer ist als die Verwendung eines regulären Skript-Tags mit den Flags async + defer. Siehe https://ibb.co/nyhJ3v