El Atributo ONCHANGE

Es un evento de JavaScript que se activa cuando el usuario modifica el valor de un elemento y confirma el cambio (al salir del campo o seleccionar una opción).
El atributo onchange es un evento de JavaScript que se activa cuando el usuario modifica el valor de un elemento y confirma el cambio (al salir del campo o seleccionar una opción). Es fundamental para validar formularios, actualizar contenido dinámico y manejar interacciones complejas.
¿Dónde se aplica?
Funciona en elementos interactivos que permiten cambios de valor:
-
<input>(text, checkbox, radio, file, etc.) -
<select> -
<textarea>
Sintaxis básica
Como atributo HTML:
<input type="text" onchange="miFuncion()">
Con JavaScript (recomendado para separar lógica):
elemento.addEventListener('change', function(evento) {
// Acciones al cambiar el valor
});
Ejemplos prácticos
Ejemplo 1: Validación de campo de texto
<input
type="email"
id="correo"
placeholder="Ingresa tu email"
onchange="validarEmail(this)"
>
<script>
function validarEmail(campo) {
const regex = /^[^s@]+@[^s@]+.[^s@]+$/;
if (!regex.test(campo.value)) {
campo.style.border = '2px solid red';
alert('¡Correo inválido!');
} else {
campo.style.border = '1px solid #ccc';
}
}
</script>
Ejemplo 2: Selector de país con actualización dinámica
<select id="pais" onchange="actualizarCiudades()">
<option value="">Selecciona un país</option>
<option value="mx">México</option>
<option value="es">España</option>
</select>
<select id="ciudades" disabled>
<option>Cargando ciudades...</option>
</select>
<script>
function actualizarCiudades() {
const pais = document.getElementById('pais').value;
const ciudades = document.getElementById('ciudades');
ciudades.disabled = false;
// Simulación de datos
const datos = {
'mx': ['CDMX', 'Guadalajara', 'Monterrey'],
'es': ['Madrid', 'Barcelona', 'Valencia']
};
ciudades.innerHTML = datos[pais]
.map(ciudad => `<option>${ciudad}</option>`)
.join('');
}
</script>
Ejemplo 3: Carga de archivo con vista previa
<input
type="file"
id="imagen"
accept="image/*"
onchange="mostrarVistaPrevia(event)"
>
<img id="vistaPrevia" style="max-width: 300px; display: none;">
<script>
function mostrarVistaPrevia(event) {
const archivo = event.target.files[0];
const vistaPrevia = document.getElementById('vistaPrevia');
if (archivo) {
const lector = new FileReader();
lector.onload = (e) => {
vistaPrevia.src = e.target.result;
vistaPrevia.style.display = 'block';
};
lector.readAsDataURL(archivo);
}
}
</script>
Diferencias clave: onchange vs oninput
| Característica | onchange |
oninput |
|---|---|---|
| Momento de activación | Al perder el foco (blur) | En cada modificación (tiempo real) |
| Casos de uso | Validación final, envío de formularios | Búsquedas dinámicas, filtros |
| Elementos comunes | <select>, <input type="file"> |
<input type="text">, <textarea> |
Mejores prácticas
Validación en capas:
// Validación en tiempo real + final
campo.addEventListener('input', validacionBasica);
campo.addEventListener('change', validacionCompleta);
Accesibilidad:
<label for="nombre">Nombre:</label> <input type="text" id="nombre" onchange="validarNombre()" aria-describedby="errorNombre" > <div id="errorNombre" role="alert"></div>
Manejo de archivos seguro:
const inputArchivo = document.getElementById('imagen');
inputArchivo.addEventListener('change', (e) => {
const archivo = e.target.files[0];
if (archivo.size > 5 * 1024 * 1024) { // 5MB máximo
alert('Archivo demasiado grande');
e.target.value = ''; // Limpiar selección
}
});
Casos avanzados
Formulario multi-paso:
<div id="paso1">
<input type="email" id="email" onchange="guardarPaso1()">
<button onclick="mostrarPaso2()">Siguiente</button>
</div>
<div id="paso2" style="display: none;">
<!-- Campos del paso 2 -->
</div>
<script>
function guardarPaso1() {
localStorage.setItem('email', document.getElementById('email').value);
}
function mostrarPaso2() {
document.getElementById('paso1').style.display = 'none';
document.getElementById('paso2').style.display = 'block';
}
</script>
Filtros combinados:
<input type="text" id="busqueda" placeholder="Buscar...">
<select id="categoria" onchange="filtrarProductos()">
<option value="">Todas</option>
<option value="electronica">Electrónica</option>
</select>
<script>
function filtrarProductos() {
const texto = document.getElementById('busqueda').value.toLowerCase();
const categoria = document.getElementById('categoria').value;
// Lógica de filtrado combinado
}
</script>
Errores comunes
<!-- MAL: Usar en elementos no interactivos --> <div onchange="..."></div> <!-- No funciona --> <!-- CONFUSIÓN: Esperar respuesta inmediata --> <input type="text" onchange="validar()"> <!-- Se activa solo al salir del campo --> <!-- OLVIDAR limpiar valores --> <input type="file" onchange="subirArchivo()"> <!-- El valor persiste hasta recargar la página -->
Compatibilidad
| Navegador | Soporte |
|---|---|
| Chrome | ✅ Todas versiones |
| Firefox | ✅ Todas versiones |
| Safari | ✅ Todas versiones |
| Edge | ✅ Todas versiones |
| Móviles | ✅ Total (iOS/Android) |
Cómo desactivar el evento
// Eliminar listener específico
const campo = document.getElementById('miCampo');
campo.removeEventListener('change', miFuncion);
// Desactivar completamente
campo.onchange = null;
Conclusión
El atributo onchange es ideal para:
- Validar datos después de la interacción completa del usuario.
- Actualizar contenido dependiente de selecciones.
- Manejar archivos y entradas complejas.
Recuerda:
- Combínalo con
oninputpara validación en tiempo real. - Usa
addEventListenerpara mantener tu código limpio y mantenible. - Prueba en diferentes dispositivos para garantizar el comportamiento esperado.
¡Ahora puedes crear formularios interactivos y profesionales con manejo robusto de datos!