Вы можете динамически добавлять сценарии на страницу с помощью document.createElement
и добавлять их в DOM с помощью .async = true
и вызывать функцию init()
вашей игры из прослушивателя событий load
сценария:
function addGameScriptToPage() {
const scriptElement = document.createElement('script');
scriptElement.async = true;
scriptElement.addEventListener( 'load', function( e ) { new BubbleShoot.Game().init(); } );
scriptElement.src = '__js/game.js';
document.head.appendChild( scriptElement );
}
Вы можете сделать его более обобщенным c, передав URL-адрес сценария в качестве параметра и вернув Promise
для прослушивателя событий load
, поэтому страницы, использующие эту функцию, могут иметь свои собственные пользовательские логи загрузки c:
function addScriptToPage( scriptUrl ) {
return new Promise( ( resolve, reject ) => {
const scriptElement = document.createElement('script');
scriptElement.async = true;
scriptElement.addEventListener( 'load', function( e ) {
resolve( e );
);
scriptElement.addEventListener( 'error', function( e ) {
reject( e );
);
scriptElement.src = scriptUrl;
document.head.appendChild( scriptElement );
} );
}
Используется примерно так:
async function doStuff() {
const shouldLoadGame = prompt( "Would you like to play a game of global thermonuclear war?" );
if( shouldLoadGame ) {
try {
await addScriptToPage( "__js/game.js" );
// This code runs when the 'load' event listener calls `resolve(e)`.
const g = new BubbleShoot.Game();
g.init();
}
catch( err ) {
// This code runs when the 'error' event listener calls `reject(e)`.
alert( "Game failed to load." ); //
}
}
}
... и это во многом похоже на то, как работает функция require()
для загрузки модулей по запросу, кстати.