SCORM 1.0/1.2 LMSFinish не вызывает

У меня возникли проблемы с пакетами HTML5 SCORM.

TL;DR; LMSFinish() не вызывается. x.prototype.terminate() в SCORM также не вызывается, что наводит меня на мысль о проблеме с пакетом.

LMSFinish() должен вызываться при нажатии кнопки выхода (и/или при закрытии окна). Однако console.log() и точки останова в LMSFinish() показывают, что это не вызывается.

LMSInitialise работает хорошо, когда окно открывается, но для LMSFinish после проверки исходного кода внутри SCORM и размещения точек останова в функции window.unload() я вижу, что это только часть пути к выходу.

window.unload вызывает closeLms(), который, в свою очередь, запускает запутанный x.prototype.terminate(). Эта функция завершения выполняет логическую проверку перед вызовом некоторых других функций, что в конечном итоге приводит к вызову LMSFinish(). Это никогда не заходит так далеко. Логическая проверка в x.prototype.terminate() всегда ложна. Если я установлю в консоли значение true, некоторые другие свойства не будут существовать, и результирующий вызов функции завершится ошибкой.

Кто-нибудь знает, почему SCORM не может запустить LMSFinish()? Тестовый пакет SCORM состоит из трех слайдов без взаимодействия.

РЕДАКТИРОВАТЬ: единственный написанный пользовательский код javascript — это обработчики для SCORM API (LMSInitialise, LMSFinish и т. д.). Они вызываются из javascript в пакете SCORM, сгенерированного любым приложением, которое пользователь решит использовать для его создания. (Articulate, Captivate и т. д.)


person Simon Willan    schedule 29.01.2016    source источник
comment
Популярная проблема с событиями выгрузки тела. Убедитесь, что вместо него используется окно. Обычно я настраиваю прослушиватели для window.unload и onbeforeunload.   -  person Mark    schedule 29.01.2016
comment
Используете ли вы собственный JavaScript для обработки SCORM или код из стороннего инструмента? В вашем комментарии к Эндрю ниже вы упоминаете Articulate и Captivate, но ваш вопрос написан так, как будто вы сами пишете JS. Без четкой картины (и фактического кода) трудно предоставить полезную обратную связь.   -  person pipwerks    schedule 31.01.2016
comment
Извините за не совсем ясность, я отредактировал сообщение, добавив немного больше информации. Я не могу предоставить пакет, который вызывает проблему. Я могу только предположить, что приложение (Adobe Captivate) создает пакет с настройкой, которая предотвращает выполнение кода для LMSFinish. Или что-то вдоль этих линий. Я надеялся, что кто-то видел это раньше.   -  person Simon Willan    schedule 01.02.2016


Ответы (2)


В зависимости от вашего браузера и некоторых других переменных код, прикрепленный к window.unload, не всегда выполняется.

Лучшим подходом является регулярное сохранение данных и наличие кнопки сохранения и выхода, которую вы предлагаете учащемуся щелкнуть, если он хочет сохранить свою работу.

Вы также можете посмотреть window.onbeforeunload.

person Andrew Downes    schedule 29.01.2016
comment
Спасибо. Однако код выгрузки является частью пакета SCORM. Это то, что Articulate или Adobe Captivate создают при экспорте. Это не то, что я могу контролировать, когда ожидаю, что их будут создавать клиенты, не разбирающиеся в технологиях. Кроме того, функция выгрузки работает, что-то еще в SCORM js останавливает выполнение. Не по ошибке, а скорее по ложной переменной. Возможно настройки связаны...? - person Simon Willan; 29.01.2016
comment
Возможно, это тайм-аут? Может быть, посмотреть сетевую активность и вручную нажать LMSCommit и т. д., чтобы увидеть, есть ли что-то очевидное, что закрытие обычно скрывает? - person Rycochet; 29.01.2016
comment
Так это пакет сюжетной линии или увлекательный пакет? Можешь поделиться? - person Andrew Downes; 30.01.2016
comment
@AndrewDownes это Captivate. Я не могу поделиться посылкой, так как она принадлежит одному из наших клиентов. Несколько клиентов сообщают об этой проблеме со своими пакетами, но поскольку единственный код, который мы пишем, — это SCORM API LMSFinish(), а остальной код генерируется Captivate, я предполагаю, что причиной проблемы был именно Captivate. - person Simon Willan; 01.02.2016

Я понял это в конце концов. Для всех, у кого могут быть проблемы с SCORM, который ведет себя не так, как ожидалось.

В моем конкретном случае LMSSetValue() и LMSGetValue() возвращали только то, что было необходимо в проекте. Оказывается, им обоим нужно обрабатывать каждое значение, которое SCORM пытается установить и получить, независимо от того, используете вы его или нет.

Я просто создал объект как свойство window.API{} и удостоверился, что ему были присвоены все значения в LMSSetValue() в парах ключ-значение, и эти значения были затем готовы для извлечения в LMSGetValue().

person Simon Willan    schedule 14.04.2016