From 9869eac9d50d079aabcb11552900b8c22ebaab2e Mon Sep 17 00:00:00 2001 From: Frode Petterson <frode.andre.petterson@gmail.com> Date: Wed, 5 Jan 2022 13:41:42 +0100 Subject: [PATCH] JI-2981 Fix JS files being loaded multiple times This is an issue with complex editors/content types where code might be executing while it's being overwritten. For example, this can happen when IV and CP are used together in Column and can cause strange bugs. --- scripts/h5peditor.js | 46 ++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/scripts/h5peditor.js b/scripts/h5peditor.js index c88e1186..3affeec6 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 -- GitLab