Documentación de CourseNav.js
Versión: 1.1.5
Autor: Salvador Martínez Gaytán
Licencia: Comercial Propietaria
Descripción
CourseNav.js es una librería en Vanilla JS para gestionar:
- Carga dinámica de contenido (HTML + scripts)
- Navegación “prev/next” con bloqueo hasta completar cada slide
- Integración con SCORM (pipwerks wrapper)
- Control de audio avanzado (Howler.js)
- Diálogos de inicio/retomar con SweetAlert2
- Barra de progreso y eventos custom
No depende de jQuery, Swiper ni Bootstrap, y funciona incluso con CSP/CORS restrictivos.
Prerrequisitos
Antes de coursenav.js debes incluir en tu HTML:
<script src="path/to/pipwerks-scorm.js"></script>
<script src="path/to/howler.core.min.js"></script>
<script src="path/to/sweetalert2.all.min.js"></script>
<script src="path/to/coursenav.js"></script>
Estructura del DOM requerida
<div id="main-content"></div>
<div id="loader-course" style="display:none"></div>
<button id="prev-btn">Prev</button>
<button id="next-btn">Next</button>
<div id="progress-bar"></div>
<button id="audio-control"></button>
<i id="audio-icon"></i>
<svg><circle id="progress-circle" r="50"></circle></svg>
Si cambias los IDs, ajusta las llamadas a
document.getElementById(...)en el código.
Inicialización automática
Al cargarse el DOM, CourseNav:
- Inicializa SCORM o sessionStorage
- Carga
config.jsonmediante XHR con cookies y cabeceraX-Requested-With - Construye el array
courseData.contentArray - Muestra diálogo “Retomar / Comenzar de nuevo” o arranca el curso
- Carga el primer slide e instala la navegación
API pública
const CN = window.CourseNav;
Control de Audio
CN.audioControllerloadAudio(url)playAudio(),pauseAudio(),stopAudio()toggleAudio(),toggleMute()
CN.createSound(audioUrl)→ retornaExtendedHowlCN.soundClick()→ reproduce sonido de clicCN.isDebug()→truesi debug activo
Navegación de Slides
CN.nextSlide(),CN.prevSlide()CN.gotoSlide(index)→ salta a slide validadoCN.isVisited()→truesi slide actual ya visitadoCN.isCompletedSlideIndex(idx)→visitedde slideidxCN.getCurrentSlide()→{ title, content, audio, visited }CN.setSlideVisited([state])→ marca visitado + dispara eventoCN.markSlidesAsVisited(indicesArray)CN.updateProgressBar()→ refresca#progress-bar
SCORM / Progreso
CN.getStudentName()CN.getLessonLocation(),CN.setLessonLocation(loc)CN.getLessonStatus(),CN.setLessonStatus(status)CN.getScore(),CN.setScore(score)CN.getSuspendData(),CN.setSuspendData(data)CN.getScormData(key),CN.setScormData(key,value)CN.save()→ guarda en SCORM o sessionStorageCN.completeLesson()→ marca estado SCORM “completed”
Utilitarios
CN.resetCourse()→ reinicia todo el progresoCN.reload()→ recarga slide actual
Eventos personalizados
document.body.addEventListener("slideChange", e => {
console.log("Slide cambiado:", e.detail.slideIndex);
});
document.body.addEventListener("slideCompleted", e => {
console.log("Slide completado:", e.detail.slideIndex);
});
e.detailcontiene{ message, slideIndex, totalSlides, slide }.
Ejemplos de uso
Saltar a un slide
CourseNav.gotoSlide(4); // va al slide índice 4
Control de audio desde UI
<button id="audio-control">🔊</button>
<script>
document.getElementById("audio-control")
.addEventListener("click", () => CourseNav.audioController.toggleMute());
</script>
Notas técnicas
- XHR en
loadConfig()para sortear CSP/CORS de SuccessFactors. - executeInjectedScripts() re-ejecuta
<script>externos e inline trasinnerHTML. - ExtendedHowl incluye evento
onTimeUpdatecada 250 ms. - No hay dependencias externas (jQuery/Swiper/Bootstrap).
Description
Languages
CSS
67.8%
HTML
21.9%
JavaScript
8.3%
SCSS
2%