diff --git a/js/h5p-x-api.js b/js/h5p-x-api.js index 6becdad..1cf8b74 100644 --- a/js/h5p-x-api.js +++ b/js/h5p-x-api.js @@ -95,7 +95,8 @@ H5P.EventDispatcher.prototype.triggerXAPIScored = function (score, maxScore, ver H5P.EventDispatcher.prototype.setActivityStarted = function() { if (this.activityStartTime === undefined) { // Don't trigger xAPI events in the editor - if (H5PIntegration.contents !== undefined && + if (this.contentId !== undefined && + H5PIntegration.contents !== undefined && H5PIntegration.contents['cid-' + this.contentId] !== undefined) { this.triggerXAPI('attempted'); } diff --git a/js/h5p.js b/js/h5p.js index 4a36aad..934d8f6 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1953,21 +1953,34 @@ H5P.createTitle = function (rawTitle, maxLength) { } if (H5PIntegration.saveFreq !== false) { + // When was the last state stored + var lastStoredOn = 0; // Store the current state of the H5P when leaving the page. var storeCurrentState = function () { - for (var i = 0; i < H5P.instances.length; i++) { - var instance = H5P.instances[i]; - if (instance.getCurrentState instanceof Function || - typeof instance.getCurrentState === 'function') { - var state = instance.getCurrentState(); - if (state !== undefined) { - // Async is not used to prevent the request from being cancelled. - H5P.setUserData(instance.contentId, 'state', state, {deleteOnChange: true, async: false}); + // Make sure at least 250 ms has passed since last save + var currentTime = new Date().getTime(); + if (currentTime - lastStoredOn > 250) { + lastStoredOn = currentTime; + for (var i = 0; i < H5P.instances.length; i++) { + var instance = H5P.instances[i]; + if (instance.getCurrentState instanceof Function || + typeof instance.getCurrentState === 'function') { + var state = instance.getCurrentState(); + if (state !== undefined) { + // Async is not used to prevent the request from being cancelled. + H5P.setUserData(instance.contentId, 'state', state, {deleteOnChange: true, async: false}); + } } } } }; - H5P.$window.one('beforeunload unload', storeCurrentState); + // iPad does not support beforeunload, therefore using unload + H5P.$window.one('beforeunload unload', function () { + // Only want to do this once + H5P.$window.off('pagehide beforeunload unload'); + storeCurrentState(); + }); + // pagehide is used on iPad when tabs are switched H5P.$window.on('pagehide', storeCurrentState); }