Pregunta

Me pregunto si existe un estándar definido para cuál es la acción predeterminada de varios elementos HTML. He consultado la especificación HTML de W3C y Si bien son muy precisos con los atributos que se pueden usar con los elementos (y también algunas cosas de comportamiento, como exactamente lo que se incluye con el envío de formularios), no hay nada sobre el comportamiento de los elementos. También he revisado la referencia de Mozilla JS , y tampoco encontré nada allí.

En particular, estoy buscando el comportamiento predeterminado de un botón de envío de formulario; He visto en diferentes lugares que su acción predeterminada es enviar el formulario y, alternativamente, que su acción predeterminada no es enviar el formulario sino más bien enfocarse. En consecuencia, parece no haber consenso sobre si onclick = " return false; " para un botón de envío detendrá el envío del formulario o no.

(Editar para mayor claridad: no estoy tratando de hacer ninguna validación a nivel de formulario en el onclick del envío ni nada de eso; si lo estuviera, estaría usando el del formulario onsubmit en su lugar. Realmente estoy específicamente interesado en captar clics en el botón y posiblemente no tener que enviar el formulario en este caso. Esto podría terminar requiriendo que el botón onclick establezca algún estado que el onsubmit del formulario inspecciona, pero si puedo simplemente return false entonces eso es genial. Incluso si no, entonces sería crítico en qué orden el onsubmit y Se activan los controladores onclick (es decir, ¿el botón envía el envío antes de ejecutar su controlador de clics?), que de nuevo no he visto especificado en ninguna parte).

Si bien sería simplemente codificar una prueba, prefiero confiar en las especificaciones / comportamiento documentado en lugar de los resultados de una prueba trivial que indudablemente perdería cualquier sutileza si existiera. En particular, realicé una prueba rápida la semana pasada que parecía mostrar que no detuvo el envío del formulario, pero ejecutar uno hoy muestra que . No he tenido suerte de encontrar ningún tipo de recurso autorizado sobre lo que los navegadores realmente hacen cuando interactúas con sus elementos (por ejemplo, cuál es la acción predeterminada, si el controlador onclick para un botón de envío se activa antes o después el formulario de envío de envío, etc.)

Cualquier consejo sobre dónde buscar en este caso sería bienvenido.

¿Fue útil?

Solución

Los documentos relevantes son Eventos DOM3 y especificación HTML 5 .

Es posible que no tengan toda la información que necesitas, pero deberían. Por lo tanto, si encuentra que faltan, solicite que se especifiquen esos comportamientos .

Otros consejos

Una de las razones por las que te puede resultar difícil encontrar una especificación para esto es que estás viendo más de un comportamiento.

Al configurar onclick = " return false; " evitará que el botón de envío envíe el formulario, pero no evitará que se envíe el formulario. Si presiona Intro cuando un campo en el formulario tiene el foco, el formulario en sí puede enviarse sin involucrar al botón Enviar. (No conozco los detalles exactos, y pueden variar un poco de un navegador a otro, pero usted ve el principio).

para ese escenario en particular, es posible que desee experimentar con diferentes propiedades de eventos, ya que los navegadores actúan de manera diferente, el onlick es para el botón, el onsubmit es un evento de formulario, por lo que, naturalmente, si devuelve false para el onclick, eso sí no significa que el envío no vaya a surtir efecto, debe manejar el envío por separado o delegar el envío al botón de envío (al devolver el envío falso y dejar que el controlador onclick tenga form.submit), también intente con varios botones de envío para entender cómo funciona

Sé que tal vez ya lo sepas, pero algunos otros consejos que tomé al tratar con formularios, experimentar con event.cancelBubble = true y event.returnValue = false (específico de IE, no estoy seguro acerca de Firefox), a veces devuelven false no es lo suficientemente bueno ...

en cuanto a la documentación, la biblioteca de MSDN documenta la acción predeterminada para todos los eventos, aquí está la documentación para el envío: http://msdn.microsoft.com/en- us / library / ms535249 (VS.85) .aspx #

  

Curiosamente: el método de envío hace   no invocar el controlador de eventos de envío.

lo que es genial, de lo contrario, ¡se habría ido en un bucle infinito!

y aquí está la documentación para el onlcick http://msdn.microsoft.com/en-us /library/ms536913(VS.85).aspx

La biblioteca de MSDN también documenta todos los eventos y objetos, pero a un precio, ¡todo es específico de IE!

Sí, puede configurar un botón-- con un oyente, donde al hacer clic en el botón, puede detener el envío del formulario. El envío del formulario es el comportamiento predeterminado para un ' botón ' de tipo enviar (importante) en un formulario.

El método del evento, preventDefault (o returnValue = false para el evento de la ventana, dependiendo del modelo de evento que sigue el navegador), evitará que el comportamiento de envío sea predeterminado. También detengo la Propagación (modelo MSIE = cancelBubble).

Por ejemplo, para el siguiente botón de tipo ' submit ':

<button type="submit" id="logout" name="logout" value="Log Out">Log Out</button>

Agregue un detector de eventos x-browser para ese botón en particular. Por ejemplo, suponiendo que testlogout es el nombre de su función que controla lo que sucede cuando se hace clic en el botón, se podría usar algo como lo siguiente para configurar el oyente:

var logoutBtn = (document.getElementById && document.getElementById('logout')) || 
   (document.all && document.all['logout']) || document.forms[formname].elements['logout'] || null;
if (logoutBtn) {
   if (logoutBtn.addEventListener) {
       logoutBtn.addEventListener('click',testlogout,false);
   } else if (window.attachEvent) {
       logoutBtn.attachEvent('onclick',testlogout);
   } else {
       //legacy:
       logoutBtn.onclick = testlogout;
       //...logic for document.layers support, etc.
   }
}

Luego, en la función testlogout, a la que se pasará automáticamente el evento, se pondrán a prueba las condiciones. Según las condiciones que establezca, use el evento.preventDefault o returnValue, dependiendo nuevamente de lo que soporte el navegador. Estos toman el lugar de la línea ' return false '. Por ejemplo:

function testlogout(e) 
{
    e = e || window.event;
    //... your logic here...
    e.stopPropagation?e. stopPropagation():(e.cancelBubble?e.cancelBubble():"");
    e.preventDefault?e.preventDefault():e.returnValue=false;
    return false; // in case all else fails?
}

El evento pasado tiene su propio conjunto de propiedades, por supuesto, cuyos nombres varían, nuevamente, dependiendo del modelo que siga el navegador. Estas propiedades identificarán el botón de destino en el que se hizo clic, por ejemplo.

Los modelos actuales de escucha de eventos no prestan atención a ' devolver falso '. Un comando ' return false ' caerá en oídos sordos, por así decirlo. Pero no se preocupe, siempre y cuando use lo que ellos entienden.

Espero que ayude a resolver el problema presente y subyacente. Al leer sobre los eventos de DOM y los modelos de eventos se aclararán los métodos y las propiedades disponibles.

¿Por qué usar un botón Enviar en absoluto? ¿Por qué no solo usar un botón? < input type = " button " onclick = " function () {if (allCriteriaIsMet ()) this.form.submit ()} " value = " haz clic en " / >

¿o me estoy perdiendo algo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top