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 Promise
s:
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();
}
});
}
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;
onload
jest ok dla wersji IE 9 i nowszych - więc samo ustawienieonload
jest teraz prawdopodobnie w porządku dla większości ludzi