El Atributo ONINPUT

Es un evento de JavaScript que se activa inmediatamente cuando el usuario modifica el valor de un elemento de entrada, como input, textarea, o select.
El atributo oninput es un evento de JavaScript que se activa inmediatamente cuando el usuario modifica el valor de un elemento de entrada (como <input>, <textarea>, o <select>). Es ideal para crear interacciones en tiempo real, como validaciones instantáneas, búsquedas dinámicas o actualizaciones de interfaz sin esperar a que el usuario termine de escribir.
¿Dónde se aplica?
Funciona en elementos interactivos que permiten entrada de datos:
-
<input>(text, email, password, range, search, etc.). -
<textarea>. -
<select>(en algunos navegadores modernos).
Sintaxis básica
Como atributo HTML (inline):
<input type="text" oninput="console.log('Valor actual:', this.value)">
Con JavaScript (recomendado para separar lógica):
const input = document.getElementById("miInput");
input.addEventListener("input", (e) => {
console.log("Valor modificado:", e.target.value);
});
Ejemplos prácticos
Ejemplo 1: Contador de caracteres en tiempo real
<textarea
id="mensaje"
placeholder="Escribe algo..."
maxlength="200"
></textarea>
<p>Caracteres restantes: <span id="contador">200</span></p>
<script>
const textarea = document.getElementById("mensaje");
const contador = document.getElementById("contador");
textarea.addEventListener("input", () => {
const restantes = 200 - textarea.value.length;
contador.textContent = restantes;
contador.style.color = restantes < 20 ? "red" : "black";
});
</script>
Ejemplo 2: Búsqueda instantánea (live search)
<input type="search" id="busqueda" placeholder="Buscar...">
<ul id="resultados"></ul>
<script>
const resultados = [
"Manzana", "Banana", "Naranja", "Pera", "Uva"
];
document.getElementById("busqueda").addEventListener("input", (e) => {
const termino = e.target.value.toLowerCase();
const lista = document.getElementById("resultados");
lista.innerHTML = resultados
.filter(item => item.toLowerCase().includes(termino))
.map(item => `<li>${item}</li>`)
.join("");
});
</script>
Ejemplo 3: Control deslizante con valor dinámico
<input type="range" id="volumen" min="0" max="100"
oninput="actualizarValor(this.value)"> <p>Volumen: <span id="valorVolumen">50</span>%</p> <script> function actualizarValor(valor) { document.getElementById("valorVolumen").textContent = valor; } </script>
Diferencias clave entre eventos
| Evento | Descripción | Momento de activación |
|---|---|---|
oninput |
Al modificar el valor (tiempo real) | Inmediatamente |
onchange |
Al confirmar el cambio (pierde el foco) | Al salir del campo |
onkeyup |
Al soltar una tecla (no captura otros cambios) | No cubre pegar/arrastrar |
Mejores prácticas
Validación instantánea:
input.addEventListener("input", (e) => {
if (!e.target.value.includes("@")) {
mostrarError("Ingresa un correo válido");
}
});
Debounce para operaciones pesadas:
Evita sobrecargar el navegador con muchas llamadas (ej: búsquedas API):
let timeout;
input.addEventListener("input", (e) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
buscarEnAPI(e.target.value);
}, 300); // Espera 300ms después de la última entrada
});
Accesibilidad:
Usa <label> asociado al input.
Proporciona mensajes accesibles con aria-live:
<div aria-live="polite" id="error-email"></div>
Casos avanzados
Editor Markdown en tiempo real:
<textarea id="editor" placeholder="Escribe en Markdown..."></textarea>
<div id="vistaPrevia"></div>
<script>
document.getElementById("editor").addEventListener("input", (e) => {
// Convertir Markdown a HTML (usando una librería como marked.js)
document.getElementById("vistaPrevia").innerHTML = marked.parse(e.target.value);
});
</script>
Formulario de presupuesto dinámico:
<input type="number" id="cantidad" placeholder="Cantidad" oninput="calcularTotal()">
<input type="number" id="precio" placeholder="Precio unitario" oninput="calcularTotal()">
<p>Total: $<span id="total">0</span></p>
<script>
function calcularTotal() {
const cantidad = document.getElementById("cantidad").value || 0;
const precio = document.getElementById("precio").value || 0;
document.getElementById("total").textContent = cantidad * precio;
}
</script>
Errores comunes
<!-- MAL: Usar en elementos no interactivos -->
<div oninput="..."></div> <!-- No funciona -->
<!-- CONFUSIÓN: Esperar que funcione con todos los tipos de input -->
<input type="color" oninput="..."> <!-- Sí funciona en navegadores modernos -->
<!-- OLVIDAR sanitizar entradas -->
<script>
input.addEventListener("input", (e) => {
// ¡Inyección de código si se usa innerHTML sin sanitizar!
resultado.innerHTML = e.target.value;
});
</script>
Compatibilidad
| Navegador | Soporte | Notas |
|---|---|---|
| Chrome | ✅ Todas versiones | |
| Firefox | ✅ v4+ | |
| Safari | ✅ v5+ | |
| Edge | ✅ Todas versiones | |
| Móviles | ✅ Sí (iOS/Android) |
Conclusión
El atributo oninput es esencial para:
- Crear interacciones en tiempo real sin retrasos.
- Mejorar la experiencia del usuario con feedback inmediato.
- Validar formularios dinámicamente mientras el usuario escribe.
Recuerda:
- No abuses para operaciones costosas (usa debounce/throttle).
- Combínalo con
onchangesi necesitas validación final. - Prueba en todos los navegadores para garantizar consistencia.
¡Ahora puedes crear formularios y aplicaciones altamente interactivas!