diff --git a/scripts/h5peditor.js b/scripts/h5peditor.js index c88e1186c7b7109d10e2513733ced29dbf1ebb85..3affeec6e0dc6d90746129875887c74c1df76493 100644 --- a/scripts/h5peditor.js +++ b/scripts/h5peditor.js @@ -56,34 +56,46 @@ ns.isIE = navigator.userAgent.match(/; MSIE \d+.\d+;/) !== null; */ ns.renderableCommonFields = {}; -/** - * Help load JavaScripts, prevents double loading. - * - * @param {string} src - * @param {Function} done Callback - */ -ns.loadJs = function (src, done) { - if (H5P.jsLoaded(src)) { - // Already loaded - done(); - } - else { - // Loading using script tag +(() => { + const loading = {}; // Map of callbacks for each src being loaded + + /** + * Help load JavaScripts, prevents double loading. + * + * @param {string} src + * @param {Function} done Callback + */ + ns.loadJs = (src, done) => { + if (H5P.jsLoaded(src)) { + // Already loaded + done(); + return; + } + + if (loading[src] !== undefined) { + // Loading in progress... + loading[src].push(done); + return; + } + + loading[src] = [done]; + + // Load using script tag var script = document.createElement('script'); script.type = 'text/javascript'; script.charset = 'UTF-8'; script.async = false; script.onload = function () { H5PIntegration.loadedJs.push(src); - done(); + loading[src].forEach(cb => cb()); }; script.onerror = function (err) { - done(err); + loading[src].forEach(cb => cb(err)); }; script.src = src; document.head.appendChild(script); - } -} + }; +})(); /** * Helper function invoked when a library is requested. Will add CSS and eval JS