Se requiere entrada HTML5, desplácese hasta la entrada con la barra de navegación fija al enviar
⏰ 8 minutos de lectura
Agustín Riedinger
Cuando intento enviar un formulario al que le faltan campos obligatorios, mi navegador (Chrome) muestra un mensaje que menciona que falta un campo y, si está fuera de mi pantalla, se desplaza hacia arriba.
Mi problema es que tengo un encabezado fijo de 50 px en mi página web y, como resultado, el campo de entrada está oculto y el mensaje parece salir de la nada:
En vez de
¿Hay alguna forma de evitar esto?
Intenté aplicar el margen de 50px a <html> y para <body>
Tuve exactamente el mismo problema, lástima que a nadie se le ocurrió una solución para esto.
– tirdadc
28 julio 2014 en 18:23
Creo que debemos considerar la required="required" html como algo inestable en este momento… Es complicado de usar, no es muy compatible y todavía tiene efectos secundarios como este…
– Agustín Riedinger
13 ago. 14 en 13:19
usando la versión 37.0.2062.120 de Chrome, funciona como usted quiere. ya lo has probado?
El desplazamiento debe ser la altura de su encabezado y el retraso es el tiempo que desea que tarde en desplazarse hasta el elemento.
¡Exactamente lo que necesitaba! Pero tenga cuidado: si usa un retraso > 0, el mensaje del navegador “Complete este campo” desaparecerá tan pronto como comience el desplazamiento (por lo que solo es visible durante unos pocos milisegundos)
La única forma que encontré es agregar una ‘anulación’ al controlador no válido. Para implementar esto para cada entrada en su formulario, puede hacer algo como esto.
var elements = document.querySelectorAll('input,select,textarea');
var invalidListener = function(){ this.scrollIntoView(false); };
for(var i = elements.length; i--;)
elements[i].addEventListener('invalid', invalidListener);
Esto requiere HTML5 y está probado en IE11, Chrome y Firefox.
Créditos a @HenryW por encontrar eso scrollIntoView funciona como se esperaba.
Tenga en cuenta que el parámetro falso para scrollIntoView alinea la entrada con la parte inferior, por lo que si tiene un formulario grande, puede alinearse con la parte inferior de la página.
¡Bastante agradable! ¡Aunque una depuración del navegador sería aún mejor!
– Agustín Riedinger
17 sep.
scrollIntoView no funciona con encabezados posicionados fijos en la parte superior de la página.
– feeela
08 feb.
@feeela Resolvió el problema para OP que tenía un encabezado posicionado fijo. ¿Puedes especificar qué No funciona?
– A1rPun
08 feb.
Esto no funciona si hay varias entradas no válidas porque se desplazará hasta la última entrada no válida y luego el navegador se desplazará hacia atrás hasta la primera en la parte superior y oculta por la barra de navegación fija. Debería haber una forma de ejecutar scrollIntoView solo para la primera entrada no válida, pero no sé cómo.
Cuando hay varias entradas no válidas en el formulario, solo desea desplazarse hasta la primera de ellas:
var form = $('#your-form')
var navbar = $('#your-fixed-navbar')
// listen for `invalid` events on all form inputs
form.find(':input').on('invalid', function (event) {
var input = $(this)
// the first invalid element in the form
var first = form.find(':invalid').first()
// only handle if this is the first invalid input
if (input[0] === first[0]) {
// height of the nav bar plus some padding
var navbarHeight = navbar.height() + 50
// the position to scroll to (accounting for the navbar)
var elementOffset = input.offset().top - navbarHeight
// the current scroll position (accounting for the navbar)
var pageOffset = window.pageYOffset - navbarHeight
// don't scroll if the element is already in view
if (elementOffset > pageOffset && elementOffset < pageOffset + window.innerHeight) {
return true
}
// note: avoid using animate, as it prevents the validation message displaying correctly
$('html,body').scrollTop(elementOffset)
}
})
ok, hice una prueba sucia con un fragmento de código que encontré aquí en SO
Como es un código de otra persona, simplemente lo modifico para desplazarme hasta el elemento al que le faltaba un requisito de entrada. No quiero ningún crédito por ello, y tal vez ni siquiera sea lo que tienes en mente, tú o alguien más podría usarlo como referencia.
El objetivo era obtener la identificación del elemento de entrada olvidado/incorrecto:
var myelement = input.id;
var el = document.getElementById(myelement);
el.scrollIntoView(false);
Tenga en cuenta que este violín solo funciona para su violín publicado anteriormente, no maneja múltiples campos de entrada olvidados o incorrectos. Solo quería mostrar una alternativa.
Acabas de resolver un rompecabezas juntando las piezas correctas 😉 Se me ocurrió una solución aún más corta que publicaré en un segundo.
– A1rPun
17 sep.
Ver este violín. Porque especifica falso para scrollIntoView el elemento está en la parte inferior de la página. Entonces la solución no es perfecta (la mía tampoco lo es)
– A1rPun
17 sep.
creo que necesita tener falso, si es verdadero, no funciona. solía ESTA como mi referencia para dar la respuesta
– HenryW
17 sep.
si se puede modificar alignWithTop agregando el margin-top: 50px; o obteniendo la posición de los campos, ambos códigos están listos :), creo que depende del OP ajustarlo.
– HenryW
17 sep.
Mi primera solución fue obtener el getBoundingClientRect y verifique si la parte superior era menor que la parte inferior del encabezado … y luego desplace la ventana en consecuencia. Creo que scrollIntoView es aceptable;)
– A1rPun
17 sep.
Traté de usar el método de TJ Moats, pero no funcionó como era necesario, porque a menudo volvía al campo, lo cual era incorrecto al principio.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<header>This is the header</header>
<div>
<form action="">
<br>
<input id="text" type="text" required="required" /><br><br>
<input id="text" type="text" required="required" /><br><br><br><br>
<input id="text" type="text" required="required" /><br><br>
<input id="text" type="text" required="required" /><br><br><br><br>
<input id="text" type="text" required="required" /><br><br><br><br><br><br>
<input id="text" type="text" required="required" /><br><br>
<p>Click send (at the bottom of the page), without filling the input field.</p><br><br><br><br><br><br>
<input id="text" type="text" required="required" /><br><br>
<input type="submit" id="btnSubmit" />
</form>
</div>
Espero que sea útil para la gente 🙂
Acabas de resolver un rompecabezas juntando las piezas correctas 😉 Se me ocurrió una solución aún más corta que publicaré en un segundo.
– A1rPun
17 sep.
Ver este violín. Porque especifica falso para scrollIntoView el elemento está en la parte inferior de la página. Entonces la solución no es perfecta (la mía tampoco lo es)
– A1rPun
17 sep.
creo que necesita tener falso, si es verdadero, no funciona. solía ESTA como mi referencia para dar la respuesta
– HenryW
17 sep.
si se puede modificar alignWithTop agregando el margin-top: 50px; o obteniendo la posición de los campos, ambos códigos están listos :), creo que depende del OP ajustarlo.
– HenryW
17 sep.
Mi primera solución fue obtener el getBoundingClientRect y verifique si la parte superior era menor que la parte inferior del encabezado … y luego desplace la ventana en consecuencia. Creo que scrollIntoView es aceptable;)
– A1rPun
17 sep.
Schlebe
Puedes usar oninvalid atributo de evento de HTML5 y en la etiqueta de su script escriba una función para redirigirlo.
Hola Abhilash. Veo que eres un usuario nuevo. Para su información, he formateado su código usando {} como código fuente. Esto es mejor que usar caracteres ` para resaltar texto y usar mucho para simular una nueva línea.
– Schlebe
31 oct.
@schlebe Muchas gracias
– Abhilash Sharma
13 jul.
.
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Tuve exactamente el mismo problema, lástima que a nadie se le ocurrió una solución para esto.
– tirdadc
28 julio 2014 en 18:23
Creo que debemos considerar la
required="required"
html como algo inestable en este momento… Es complicado de usar, no es muy compatible y todavía tiene efectos secundarios como este…– Agustín Riedinger
13 ago. 14 en 13:19
usando la versión 37.0.2062.120 de Chrome, funciona como usted quiere. ya lo has probado?
– dippas
17 sep.
prueba esto: jsfiddle.net/LL5S6/46
– Abudayah
17 sep.