Introducción a Javascript

Cuando abrimos una página web en el navegador, éste interpreta el código HTML para entender qué contenido hay y qué significa cada parte. Después aplica el CSS para definir el aspecto visual de ese contenido. Pero una página web moderna no solo necesita estructura y presentación: en muchos casos también necesita comportamiento, lógica e interacción. Ahí es donde entra JavaScript.

JavaScript es el lenguaje que permite que una página web responda a acciones del usuario, modifique contenidos, valide formularios, cargue información sin recargar toda la página o cambie el estado de distintos elementos de la interfaz. Es, por tanto, la parte de la Web que aporta funcionalidad y dinamismo.

Qué es JavaScript

JavaScript es un lenguaje de programación. A diferencia de HTML y CSS, que no son lenguajes de programación, Javascript sí puede ejecutar comandos y funciones de lógica. Esto no implica que Javascript no tenga que relacionarse con HTML o CSS. Con HTML describimos el contenido y su estructura. Con CSS definimos la presentación visual. Con JavaScript programamos el comportamiento de la página.

Dónde se puede usar Javascript

Aunque mucha gente identifica JavaScript solo con el navegador, el lenguaje también se puede utilizar fuera de la Web en otros entornos como scripts en la Terminal de Linux o MacOçS, como lenguaje de programación para servidores con NodeJS o para programar servicios para la Nube.

El estándar del lenguaje se denomina ECMAScript, y JavaScript es su implementación más conocida en la actualidad.

Ejemplo básico en JavaScript

A continuación tenemos un ejemplo de una página HTML con un botón y un pequeño fragmento de JavaScript:

<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Mi primera página con JavaScript</title>
</head>
<body>
<h1>Mi primera página con JavaScript</h1>
<p id="mensaje">Todavía no ha pasado nada.</p>
<button id="boton">Pulsa aquí</button>

<script>
document.getElementById("boton").addEventListener("click", function () {
document.getElementById("mensaje").textContent = "Has pulsado el botón.";
});
</script>
</body>
</html>

Si guardamos ese contenido en un fichero con extensión .html y lo abrimos con el navegador, veremos una página con un botón. Al pulsarlo, el texto del párrafo cambiará.

Ese cambio no lo hace HTML ni lo hace CSS. Lo hace JavaScript.

Qué está ocurriendo en el ejemplo

Aunque a primera vista pueda parecer mucho código, en realidad están pasando pocas cosas.

Primero tenemos este párrafo:

<p id="mensaje">Todavía no ha pasado nada.</p>

Ese párrafo tiene un atributo id con el valor mensaje. Ese identificador nos permite localizar el elemento desde JavaScript.

Después tenemos este botón:

<button id="boton">Pulsa aquí</button>

También tiene un id, en este caso boton.

Y por último aparece el bloque script:

<script>
document.getElementById("boton").addEventListener("click", function () {
document.getElementById("mensaje").textContent = "Has pulsado el botón.";
});
</script>

Ese bloque contiene código JavaScript que el navegador ejecuta. La instrucción busca el botón, escucha el evento de pulsación (click) y, cuando ese evento ocurre, modifica el texto del párrafo.

La etiqueta <script>

La forma más habitual de incluir JavaScript en una página HTML es mediante la etiqueta <script>.

Puede escribirse directamente dentro del propio documento HTML:

<script>
console.log("Hola desde JavaScript");
</script>

O bien enlazarse desde un fichero externo:

<script src="app.js"></script>

En la práctica, cuando el código crece, lo normal es utilizar un fichero independiente. Esto facilita el mantenimiento, permite reutilizar código y evita mezclar demasiadas responsabilidades en el HTML.

JavaScript y el DOM

Cuando JavaScript trabaja con una página HTML, normalmente no “ve” el fichero como texto plano, sino como una estructura interna que el navegador ha construido en memoria.

A esa representación se la suele llamar DOM (Document Object Model).

Utilizando el DOM, JavaScript puede realizar diversas funciones como buscar y manipular elementos de la página, añadir y eliminar elementos, reaccionar a eventos provocados por el usuario o por el navegador…

JavaScript no sustituye a HTML

Una idea importante al empezar es que JavaScript no debería utilizarse para suplir una mala estructura HTML.

Primero conviene tener un documento HTML bien organizado y semántico. Después CSS se ocupa de la presentación. Y finalmente JavaScript añade comportamiento.

Si se invierte ese orden, es fácil terminar con páginas difíciles de mantener, menos accesibles y más frágiles.

En artículos anteriores indicamos que HTML describe contenido y CSS describe presentación. Siguiendo esa idea de separar contenido, diseño y funcionalidad, Javascript debe añadir funcionalidad sin romper la semántica del documento. Esta separación de responsabilidades hace que la página sea más clara, con un mejor mantenimiento y más robusta.

JavaScript no debe ser intrusivo ni imprescindible

Aunque JavaScript aporta mucha potencia a una página web, conviene usarlo con cierta prudencia.

Una mala práctica bastante común consiste en construir páginas que dependen completamente de JavaScript para funcionar, incluso en tareas básicas como mostrar contenido, seguir enlaces o enviar un formulario. Cuando esto ocurre, la página se vuelve dependiente de Javascript y, en muchos casos, menos accesible.

Lo apropiado es que HTML proporcione una base sólida por sí mismo. Es decir, que la estructura del documento, los enlaces, los textos y la información principal existan ya en el marcado. Después, JavaScript puede enriquecer esa base con comportamiento adicional: validar datos en el navegador, mostrar u ocultar partes de la interfaz, actualizar contenidos o responder a acciones del usuario.

Con esto se mantiene la idea de que JavaScript debería mejorar la experiencia, no convertirse en un obstáculo.

También conviene evitar un uso intrusivo del lenguaje. Por ejemplo, no es buena idea abrir ventanas inesperadas, cambiar el foco sin necesidad, alterar el contenido de manera brusca sin avisar o interceptar comportamientos normales del navegador si no hay un motivo claro. Todas esas prácticas pueden desorientar a muchas personas usuarias y hacer que la navegación resulte confusa.

Accessible stopwatch para MacOS: simple, útil y accesible

Ya está disponible en la MacAppStore la última aplicación de Tyflos Accessible Software. Esta aplicación es Accessible stopwatch.

Esta app está diseñada para medir el tiempo de forma rápida, clara y totalmente accesible. Perfecta para contabilizar cuánto tardas en completar una tarea, controlar el tiempo de trabajo de un equipo o llevar el seguimiento de cualquier actividad en la que necesites un cronómetro sencillo y fiable.

Esta aplicación nace de la necesidad concreta de tener una app disponible en MacOS para controlar el tiempo invertido en completar ciertas tareas pero buscando no ser intrusiva y no crear barreras cognitivas y solucionar otras carencias de accesibilidad en apps de este tipo.

Puedes descargar esta app de la MacAppStore.

Introducción a CSS

Cuando abrimos una página web en el navegador, éste interpreta el código HTML para entender qué contenido hay y qué significa cada parte (títulos, párrafos, enlaces, formularios, etc.).

Además de estructura y semántica, una página necesita presentacióny estilo visual (tipografías, tamaños, colores, márgenes, alineación, distribución en columnas, etc).

En los artículos sobre HTML se ha hablado de contenido, semántica y estructura pero nunca hablamos de aspecto visual o diseño. Esto se debe a que HTML, en las versiones más modernas y responsables con la accesibilidad, ha cedido toda la responsabilidad de definir el aspecto visual del contenido a la parte CSS de una página web.

Qué es CSS

CSS son las siglas de Cascading Style Sheets (Hojas de estilo en cascada).

Al igual que ocurre con HTML, CSS no es un lenguaje de programación. No ejecuta lógica como lo haría JavaScript; en su lugar, define reglas de estilo que el navegador aplica sobre los elementos HTML para controlar cómo se muestran en la pantalla.

La idea fundamental es separar responsabilidades entre las distintas partes de una página web. El código HTML describe el contenido y su estructura. El código CSS describe el aspecto visual y parte del comportamiento de presentación (por ejemplo, el diseño adaptable o ciertas animaciones). Por último, el código Javascript describe la funcionalidad y el dinamismo de la página.

Ejemplo básico en CSS

Un ejemplo típico es tener un fichero HTML y, aparte, un fichero CSS enlazado. Por ejemplo, un HTML clásico es:

<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Mi primera página con CSS</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Mi primera página</h1>
<p>Este es un párrafo con información.</p>
<a href="https://programaraciegas.net">Visitar el blog</a>
</body>
</html>

Y el contenido del fichero styles.css podría ser:

body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}

h1 {
font-size: 2rem;
}

a {
text-decoration: underline;
}

Si guardamos ambos ficheros en la misma carpeta y abrimos el HTML en el navegador, veremos que el contenido es el mismo, pero con el aspecto definido por las reglas CSS.

Por qué estilos en cascada

El término cascading (en cascada) tiene una razón por la forma de aplicarse los estilos en un contenido. Cuando varias reglas podrían aplicarse al mismo elemento, CSS define un sistema para resolver conflictos (origen, orden, especificidad, importancia). 

Partes de una regla CSS

La unidad básica de CSS es la regla (a veces llamada ruleset). Una regla se compone de:

• Un selector, que indica a qué elementos se aplica.
• Un bloque de declaraciones, que indica qué propiedades se aplican y con qué valores.

Veamos un ejemplo simple:

p {
font-size: 1rem;
margin-bottom: 1rem;
}

En este caso:
• p es el selector: selecciona todos los párrafos.
• Dentro de { … } hay declaraciones.
• Cada declaración es un par propiedad: valor; como font-size: 1rem;.

Cómo se aplica CSS a una página web

Hay tres formas habituales de aplicar CSS:

Hoja de estilo externa

Es la forma más común y la recomendada por accesibilidad. Se enlaza desde el <head> de la página:

<link rel="stylesheet" href="styles.css">

Entre las ventajas encontramos la separación del diseño del contenido y permite reutilizar estilos en muchas páginas.

Estilos internos

Se escriben dentro de un bloque <style> en el <head>:

<style>
p { line-height: 1.6; }
</style>

Esto es útil para ejemplos o páginas muy pequeñas, pero no es reutilizable para otras páginas.

Estilos en línea

Se escriben directamente en el atributo style de un elemento del <body>: dentro de la estructura de contenidos de la página.

<p style="line-height: 1.6;">Texto</p>

Aunque este estilo se aplica al contenido, es la opción menos recomendable porque mezcla contenido y presentación y complica el mantenimiento de la página y su estructura.

Los selectores CSS

El selector es la condición que decide qué elementos reciben una regla. 
Los más utilizados son:

Selector por etiqueta

Afecta a todos los elementos de ese tipo:

p { ... }
h1 { ... }

Selector por clase

Afecta a elementos que tengan class=»…»:

.destacado { font-weight: bold; }

Y en HTML:

<p class="destacado">Texto importante</p>

Selector por id

Afecta a un único elemento con id=»…»:

#cabecera { ... }

En HTML:

<header id="cabecera">...</header>

En la práctica, para estilos suele preferirse clases antes que abusar de id, porque son más reutilizables en otros contenidos o componentes.

La cascada: qué pasa cuando hay conflicto

Es habitual que varias reglas intenten aplicar estilos al mismo elemento. CSS resuelve esto con la aplicación en cascada: el navegador decide qué declaración gana según el origen y el orden, y si hace falta entra en juego la especificidad del selector. 

Un ejemplo típico que nos podemos encontrar es:

p { color: black; }
.destacado { color: blue; }

Si un párrafo tiene class=»destacado», el color será azul porque .destacado es más específico que p.

La cascada es una de las razones por las que, al empezar con CSS, a veces parece que no se aplique correctamente a algunos contenidos. normalmente sí funciona, pero otra regla está ganando en prevalencia de la cascada.

Accesibilidad y CSS

CSS puede mejorar mucho la experiencia de navegación y la accesibilidad presente en la página web o romperla con facilidad. Un mal CSS es responsable de estas barreras de accesibilidad:

  • Contraste de color insuficiente entre texto y fondo. 
  • Eliminar el foco del teclado por estética. Evita hacer outline: none; sin ofrecer una alternativa visible.
  • No respetar preferencias del usuario, como reducir animaciones con prefers-reduced-motion. 
  • Uso de tipografía ilegible o no adaptable a las necesidades del usuario.

La nueva app de entrenamiento neurológico de la ONCE ya está disponible

El Centro de Tiflotecnología e Innovación de la ONCE (CTI) ha anunciado la disponibilidad para descarga de ENTRENO, una nueva aplicación de entrenamiento neurológico orientada a mantener la mente activa mediante una experiencia moderna, directa y especialmente pensada para el uso cotidiano en el móvil.

La propuesta llega como una renovación completa del antiguo Gimnasio Cerebral, con un enfoque actualizado que combina entretenimiento, progresión y retos diarios, sin perder de vista el objetivo de entrenar capacidades cognitivas relevantes para la vida diaria.

Desde la presentación oficial se insiste en que ENTRENO no se limita a proponer minijuegos aislados, sino que estructura el entrenamiento en sesiones breves y repetibles, incorporando retos diarios que favorecen la constancia. Esa continuidad es clave si lo que se busca es reforzar habilidades como la memoria, la atención o la rapidez mental con pequeñas píldoras de práctica distribuida.

Además, la app persigue  mejorar la destreza general en el manejo de dispositivos móviles, haciendo que la interacción con el teléfono forme parte del propio entrenamiento.

Una app accesible, gratuita y pensada para evolucionar

ENTRENO nace, según se explica en los materiales asociados al lanzamiento, como respuesta a una demanda conocida de disponer de una aplicación accesible, divertida y suficientemente desafiante que sustituyera con garantías a la anterior generación de juegos de este estilo.

Aunque está diseñada para personas con discapacidad visual, no se plantea como un producto solo para un perfil, sino como una app inclusiva que puede disfrutar cualquier persona.

La aplicación se distribuye de forma gratuita y se apoya en un planteamiento de accesibilidad amplio, con compatibilidad con lectores de pantalla y ajustes que facilitan la interacción.

El CTI vincula además el lanzamiento con la iniciativa Modos ON, orientada a impulsar el videojuego accesible, lo que ayuda a entender por qué la app adopta un lenguaje de retos, progresión y recompensas que encaja bien con dinámicas de juego.

¿qué juegos incluye?

ENTRENO incorpora nueve juegos relacionados con distintas capacidades cognitivas para el entreno de la memoria, atención, rapidez mental, percepción y funciones ejecutivas como planificar, decidir o resolver problemas.

Los juegos están diseñados para que el entrenamiento no sea abstracto, sino conectado con situaciones reales. Ositos, por ejemplo, se plantea como una tarea de selección bajo reglas cambiantes en la que la clave no es solo reaccionar, sino inhibir respuestas automáticas y sostener la concentración mientras se atienden pedidos que varían. 

En De Pesca el entrenamiento se apoya en la discriminación auditiva y la velocidad de reacción, obligando a diferenciar señales útiles frente a estímulos negativos para una partida exitosa.

El juego de Mayormente lleva el foco al cálculo mental rápido y a la actualización de información bajo presión temporal. La mecánica de comparar resultados de operaciones sencillas, incrementando la dificultad, conecta con tareas muy comunes como estimar importes, cambios o decisiones rápidas en compras.

El juego de Ciudad Bullicio trabaja la capacidad de distinguir sonidos cotidianos y decidir con rapidez si dos estímulos son iguales o distintos, semejante a los procesos de discriminación y comparación auditiva que usamos continuamente al movernos en espacios urbanos.

Esa palabra me suena se orienta a la memoria verbal reciente, con una dinámica de memorización inicial y posterior reconocimiento frente a distracciones.

En Hal Revés el énfasis recae en la flexibilidad cognitiva y en la gestión de interferencias, obligando a responder de manera contraria a lo esperado.

El objetivo de Sónar es esquivar obstáculos guiándose por la información que aporta el sonar.

El juego de Semáforo se centra en la estimación temporal, pidiendo al usuario que cuente mentalmente un número de segundos y ejecute la acción en el momento justo.

El juego de Super Ahorro utiliza el contexto del supermercado para entrenar estimación y comparación de cantidades, planteando el reto de elegir la opción más barata cuando el precio no se presenta de forma directa.

Progresión, niveles y rutina diaria

Uno de los detalles más relevantes en una app de este tipo es cómo evita el estancamiento. En la documentación asociada se indica que cada minijuego dispone de diez niveles de dificultad creciente y que, al superar el nivel máximo, se activa un modo infinito.

La app busca ofrecer un recorrido de aprendizaje claro para quien empieza y, a la vez, garantizar recorrido a medio plazo para quien busca mantener el hábito.

Disponibilidad y requisitos mínimos

ENTRENO está disponible para iOS y Android y, según el anuncio del CTI, requiere como versiones mínimas iOS 13 y Android 6.

Puedes descargar ENTRENO para iPhone desde la AppStore o descargar ENTRENO para Android desde la PlayStore.

En la página de la noticia encontrarás varios videos con más información y tutoriales.

Más voces para idiomas no habituales en iOS con RHVoice

Desde 2023 Apple empezó a permitir que algunas aplicaciones aporten motores de síntesis de voz alternativos que pueden integrarse con VoiceOver y con cualquier app que utilice el motor TTS del sistema. RHVoice es una de esas aplicaciones, y su enfoque es especialmente interesante para quienes priorizan ligereza, rapidez y cobertura lingüística antes que la naturalidad “neuronal” de las voces comerciales.

RHVoice es un sintetizador de voz gratuito y de código abierto, pensado desde el inicio para ser útil a personas ciegas o con dificultad para acceder al texto impreso, y con especial interés en idiomas donde no siempre existen voces “premium” accesibles y de calidad para lectores de pantalla.

Al momento de escribir este artículo se incluyen voces para los idiomas luxemburgués, macedonio y albanés.

Este motor de síntesis de voz emplea síntesis paramétrica estadística (apoyándose en tecnologías abiertas como HTS y software relacionado). Debido a esto el tamaño de descarga suele ser reducido porque se almacenan modelos estadísticos en lugar de ficheros de sonido grandes.

Debido al pequeño tamaño de las voces la naturalidad puede ser inferior a la de sistemas basados en concatenación de grabaciones o redes neuronales, aunque la comprensibilidad de la voz es aceptable.

RHVoice en la App Store

La aplicación está publicada por Non-Routine LLC, es gratuita, ocupa alrededor de 10,5 MB y requiere iOS/iPadOS 16.2 o posterior. También ofrece versión para macOS (13.1 o posterior) y aparece listada para Apple Vision.

RHVoice no incluye voces “de serie”. Esto se hace para reducir el tamaño inicial y para que las actualizaciones de voces sean más simples.

Al abrir la app verás la lista de idiomas disponibles; al entrar en un idioma, se muestran las voces y puedes descargarlas con el botón correspondiente. Dentro de las opciones puedes cambiar entre dos niveles de calidad de voz.

Puedes descargar RHVoice desde la AppStore.

Más voces para tu iPhone y tu iPad con eSpeakNG

Desde iOS17 es posible instalar más voces para usar en los dispositivos móviles de Apple como el iPhone o el iPad.

Aunque la síntesis de voz en los dispositivos móviles actuales se asocia a voces neuronales de alta naturalidad y a catálogos cada vez más completos, también existe un espacio igualmente relevante para soluciones ligeras, abiertas y muy multilingües. En ese terreno se sitúa eSpeak-NG, una app disponible en la App Store que actúa como puente entre la biblioteca eSpeak-NG y VoiceOver, con el objetivo de hacer utilizables estas voces en iOS, iPadOS y macOS sin tener que recurrir a integraciones complejas por parte del usuario.

Este tipo de voces son de poco peso en memoria y muy personalizables. Además están disponibles en muchos idiomas para los que, oficialmente, no existen voces de alta calidad.

¿Qué es eSpeak-NG?

Se trata de la evolución comunitaria de eSpeak, el motor creado originalmente por Jonathan Duddington.

Este motor de síntesis de voz se enfoca en ofrecer soporte para muchos idiomas y variantes con un tamaño reducido y un consumo contenido de recursos, a costa de una sonoridad menos natural que la de sintetizadores basados en grabaciones humanas. Este enfoque, basado en síntesis por formantes, explica por qué eSpeak (y su “Next Generation”) sigue siendo útil en ámbitos donde la ligereza, la velocidad y la cobertura lingüística pesan más que el realismo.

eSpeak-NG en la AppStore

La app de eSpeak-NG para Apple, publicada por Yury Popov, se describe explícitamente como una “capa de compatibilidad” entre la librería eSpeak-NG y VoiceOver.

Con la instalación de esta app se consigue que el sistema y el lector de pantalla puedan acceder a esas voces y a su configuración sin que el usuario tenga que montar entornos externos, compilar nada o depender de otras soluciones.

Puedes instalar eSpeak-NG desde la AppStore.

Soporte para Vox libri

La aplicación de lectura de libros Vox libri es compatible con este motor. Esto implica que al instalar la aplicación de eSpeak-NG podremos utilizar las voces de eSpeak para leer nuestros libros con Vox libri.