Integración avanzada del código de integración HTML (widget) a través de la API
Código de ejemplo del widget
<html>
<head>
<!-- Incluir los paquetes -->
<script src="https://cdn-apps.drimify.com/prod/widget/index.js" type="text/javascript"></script>
<!-- Configurar el widget al cargar la página -->
<script>
window.addEventListener('load', function () {
var widget = DigitaService.Widget.Create({
autoscroll: true,
element: 'gamification-widget',
engine: 'https://apps.drimify.com/Rf6aGmBR/',
fixed: false,
height:['auto'],
sharingurl: 'https://apps.drimify.com/Rf6aGmBR/',
width: '100%',
});
widget.onReady = function (event) {};
widget.onComplete = function (event) {};
widget.onFirstInteraction = function () {};
widget.onRouteChange = function (event) {};
widget.onScrollToTop = function () {};
widget.onClose = function () {};
widget.onError = function (errorEvent) {};
widget.load();
});
</script>
</head>
<body>
<div id="gamification-widget"></div>
</body>
</html>
Configuración
Crea un widget pasando un objeto de opciones a la función Create:
var widget = DigitaService.Widget.Create(options);Opciones de configuración
Obligatorias
Opción | Tipo | Descripción |
|---|---|---|
options.element | string - HTMLElement | El widget se insertará en este HTMLElement. Puedes pasar una referencia directa a un HTMLElement existente o indicar su ID como cadena de texto. Si no especificas esta propiedad, se intentará encontrar un elemento con el ID «digitaservice-widget» en la página. |
options.engine | string | La URL absoluta de la aplicación que se cargará en el widget. |
Opcionales
Opción | Tipo | Valor predeterminado | Descripción |
|---|---|---|---|
options.height | string | auto | Antes de cargarse, el widget tiene una altura predeterminada de cero. Puedes establecer una altura provisional para evitar saltos en la página, según dónde esté integrado el widget. El valor se expresa en píxeles, por ejemplo, «600px». Si utilizas options.fixed = true, la altura quedará fijada en el valor indicado y aparecerán barras de desplazamiento si son necesarias. |
options.autoscroll | boolean | true | Según la extensión del contenido del widget y la pantalla del usuario, puede ser necesario desplazarse por la página que lo contiene. De forma predeterminada, cuando el usuario utiliza el widget, la página se desplaza hasta la parte superior de este para facilitar su uso. Para desactivar este comportamiento, establece autoscroll en false. Esta propiedad será false si options.fixed es true. |
options.sharingurl | string | La URL de la página que contiene el widget | Al utilizar la función de compartir en redes sociales, esta será la URL que compartirán los usuarios para dirigir a otras personas a tu campaña. Si el valor es una cadena vacía, se utilizará la URL de la página que contiene el widget. |
options.fixed | boolean | false | Normalmente, el widget ajusta su tamaño automáticamente al contenido de la aplicación para evitar las barras de desplazamiento. Si esta opción se establece en true, la altura del widget será fija y no cambiará. En ese caso, options.height debe tener un valor distinto de «auto». Si la altura de la aplicación supera el valor indicado, se mostrarán barras de desplazamiento para navegar por el contenido. |
options.width | string | “100%” | El ancho del widget. Puede expresarse en una unidad de medida CSS, como «%» o «px». |
Carga
Una vez configurado el widget, debes cargarlo. Puedes hacerlo en cualquier momento.
Nota: Configura las funciones de callback que necesites de las que se indican a continuación antes de cargar el widget para poder capturar todos los eventos.
widget.load();Funciones de callback de eventos
onReady
Al llamar a widget.load(), el widget se carga y se inicializa. Cuando termina este proceso, se ejecuta la función de callback opcional onReady.
Nota: onReady se activa antes de que aparezca la primera pantalla. El primer evento onRouteChange indica que el participante ya puede ver contenido. Si la experiencia no puede iniciarse, onReady no se activa y se llama a onError en su lugar.
widget.onReady = function (event) {
// Cargado y listo para usar
console.log(event.type); // “ready”
console.log(event.data); // {}
};
onError
Al llamar a widget.load(), el widget se carga y se inicializa. Cualquier error crítico que se produzca a partir de ese momento ejecutará la función de callback opcional onError.
widget.onError = function (event) {
console.log(event.data.message); // Por ejemplo, "ERR_15"
};
onComplete
Se activa cuando el usuario termina el juego y llega a la pantalla final. También proporciona un objeto de datos que describe lo ocurrido durante el juego.
Nota: Si quieres ejecutar una acción en respuesta a este evento, conviene añadir un tiempo de espera dentro de la función de callback para que el usuario pueda leer la pantalla final, ya que el evento se activa en cuanto llega a ella. También puedes utilizar onClose.
widget.onComplete = function (event) {
console.log(event.type); // “complete”
console.log(event.data); // {}
console.log("La puntuación del usuario es: " + event.data.gameMetrics.score);
};
onResize
Se activa cuando cambia el tamaño de la aplicación y proporciona la altura en píxeles.
widget.onResize = function (event) {
console.log(event.type); // “resize”
console.log(event.data); // {}
console.log("Altura de la aplicación: " + event.data.height);
};
onFirstInteraction
Se activa cuando el usuario interactúa por primera vez con la aplicación cargada, ya sea tocando la pantalla o haciendo clic.
widget.onFirstInteraction = function () {
console.log("El usuario ha interactuado con la aplicación por primera vez");
};
onRouteChange
Se activa cuando la aplicación cambia de ruta dentro del widget, es decir, cuando se pasa de una pantalla a otra. El evento puede incluir un objeto de datos o no, según el contexto.
widget.onRouteChange = function (event) {
console.log(event.type) // “routechange”
console.log(event.data) // {} o undefined
console.log("El usuario ha pasado a una nueva pantalla");
};
onScrollToTop
Se activa cuando la aplicación intenta volver a la parte superior de la página. Puede utilizarse en la página que contiene el widget para comprobar si el desplazamiento no se ha ejecutado debido a CORS o si es necesario ajustarlo. El evento no incluye ningún objeto de datos.
widget.onScrollToTop = function () {
console.log("Desplazamiento a la parte superior");
};
Métricas
Esta es una lista de las principales métricas disponibles según el tipo de juego:
Clave | Descripción |
|---|---|
data.gameMetrics.CurrentAttempt | El número de intento del usuario al terminar el juego. |
data.gameMetrics.prizeID | El ID del premio. |
data.gameMetrics.prizeImage | La imagen del premio. |
data.gameMetrics.prizeName | El nombre del premio. |
data.gameMetrics.prizeRef | La referencia del premio. |
data.gameMetrics.totalPossibleAttempts | El número total de intentos posibles. |
data.gameMetrics.userWon | true o false, según si el usuario ha ganado o no. |
data.gameMetrics.score | La puntuación total acumulada por el usuario al terminar el juego. |
Credenciales
Clave | Descripción |
|---|---|
data.credentials.isPreviewMode | Indica si el juego está en modo de vista previa. |
data.credentials.projectID | El ID de la aplicación a la que se ha jugado. |
data.credentials.projectLanguage | El idioma del proyecto cargado en el widget (en, fr). |
data.credentials.projectName | El nombre de la aplicación. |
data.credentials.projectType | El tipo de aplicación (quiz, memory...). |
data.credentials.publisherID | El ID del editor. |
data.credentials.sessionID | El ID de sesión del jugador actual. |
Gestión de errores
Hay dos formas principales de detectar errores y obtener información sobre los problemas que se producen en el widget:
Función de callback onError
La función de callback onError captura los errores críticos que impiden que la experiencia se inicie o se recupere. El código de error se encuentra en event.data.message. En estos casos, onReady no se activa.
widget.onError = function (event) {
if (event.data && typeof event.data.message !== 'undefined') {
switch (event.data.message) {
default:
// No hacer nada
break;
case 'ERR_04':
console.log("No quedan visualizaciones disponibles");
break;
case 'ERR_05':
console.log("Error de seguridad");
break;
case 'ERR_07':
console.log("La aplicación no está publicada");
break;
case 'ERR_08':
console.log("La aplicación Premium no está disponible");
break;
case 'ERR_09':
console.log("No se ha detectado el UID de sesión");
break;
case 'ERR_10':
console.log("El UID de sesión no está autorizado");
break;
case 'ERR_13':
console.log("La llamada SSO ha fallado");
break;
case 'ERR_14':
console.log("El idioma no está disponible");
break;
case 'ERR_15':
console.log("La página no existe");
break;
case 'ERR_17':
console.log("La configuración de SSO no es válida");
break;
case 'ERR_21':
console.log("No hay ningún juego asignado al Combo o al Dynamic Path");
break;
}
}
};
Función de callback onRouteChange
La función de callback onRouteChange se activa cuando la aplicación pasa de una pantalla a otra dentro del widget. Resulta útil para detectar errores relacionados con el estado de la aplicación y la disponibilidad del contenido.
widget.onRouteChange = function (event) {
if (event.data && typeof event.data.errorCode !== 'undefined') {
switch (event.data.errorCode) {
default:
// No hacer nada
break;
case 'ERR_02':
console.log("El contenido aún no está disponible");
break;
case 'ERR_03':
console.log("El contenido ha caducado");
break;
case 'ERR_04':
console.log("No quedan visualizaciones disponibles");
break;
case 'ERR_16':
console.log("No hay preguntas disponibles");
break;
case 'ERR_18':
console.log("Entre dos periodos de activación");
break;
case 'ERR_19':
console.log("Fuera del horario de apertura");
break;
}
}
};
errorCode solo está presente en estas pantallas de indisponibilidad. Otras pantallas que impiden jugar al participante (porque ya ha jugado, por restricciones de acceso o por formularios rechazados) no incluyen errorCode: puedes identificarlas por el nombre de pantalla que aparece en event.data.screen.
Para consultar la lista completa de nombres de pantalla, el orden de los eventos durante la carga, el comportamiento de session_uid y los tiempos de espera de carga, consulta Ciclo de vida del widget y gestión de errores.
Obtener información del usuario en la pantalla final (onRouteChange)
Si utilizas Dynamic Path™, Advent Calendar o Combo™, puedes obtener información del usuario al finalizar cualquier juego mediante la función de callback onRouteChange.
Este método es necesario porque el evento estándar onComplete solo se activa cuando finaliza toda la experiencia de varias etapas, no cuando termina cada uno de los juegos que la componen.
Así, tu sistema puede recibir todos los resultados del juego (a través de gameInfo) cuando el usuario llega a la pantalla final de la experiencia.
Configuración
Después de crear el widget:
var widget = DigitaService.Widget.Create(options);
Añade el detector de eventos onRouteChange:
widget.onRouteChange = function (event) {
console.log(event.type); // "routechange"
console.log(event.data); // { ... } o undefined
console.log("El usuario ha pasado a una nueva pantalla");
};
```# Detección del fin de la pantalla
Cuando el usuario llegue al fin de la pantalla del juego, el widget devolverá una ruta que coincida con:
event.data.screen === 'screen_end-YOUR_APP_ID'
Sustituye `YOUR_APP_ID` por el ID real de tu aplicación.
# Obtención de la información del usuario (`gameInfo`)
Una vez detectado el fin de la pantalla, puedes extraer los datos:
event.data.gameInfo
`gameInfo` contiene un **array con información del usuario**, que puede incluir:
* Datos introducidos por el usuario
* Resultados o puntuaciones del juego
* Campos recopilados durante la experiencia
Estos datos solo están disponibles al llegar al fin de la pantalla en las experiencias utilizadas dentro de **Dynamic Path**, **Advent Calendar** o **Combo**.
# Ejemplo
widget.onRouteChange = function (event) {
if (event.data && event.data.screen === 'screen_end-12345') {
const datos = event.data.gameInfo;
console.log("Información del fin de la pantalla:", data);
// Procesa o envía esta información según tus necesidades
}
};
Actualizado el: 29/10/2026
¡Gracias!
