46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
|
/**
|
||
|
* Loads a JavaScript file from the given URL and executes it.
|
||
|
*
|
||
|
* @param {string} url Address of the .js file to load
|
||
|
* @param {function} callback Method to invoke when the script
|
||
|
* has loaded and executed
|
||
|
*/
|
||
|
export const loadScript = ( url, callback ) => {
|
||
|
|
||
|
const script = document.createElement( 'script' );
|
||
|
script.type = 'text/javascript';
|
||
|
script.async = false;
|
||
|
script.defer = false;
|
||
|
script.src = url;
|
||
|
|
||
|
if( typeof callback === 'function' ) {
|
||
|
|
||
|
// Success callback
|
||
|
script.onload = script.onreadystatechange = event => {
|
||
|
if( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {
|
||
|
|
||
|
// Kill event listeners
|
||
|
script.onload = script.onreadystatechange = script.onerror = null;
|
||
|
|
||
|
callback();
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Error callback
|
||
|
script.onerror = err => {
|
||
|
|
||
|
// Kill event listeners
|
||
|
script.onload = script.onreadystatechange = script.onerror = null;
|
||
|
|
||
|
callback( new Error( 'Failed loading script: ' + script.src + '\n' + err ) );
|
||
|
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
// Append the script at the end of <head>
|
||
|
const head = document.querySelector( 'head' );
|
||
|
head.insertBefore( script, head.lastChild );
|
||
|
|
||
|
}
|