tengo un .submit()
evento configurado para enviar formularios. También tengo varios formularios en la página, pero solo uno aquí para este ejemplo. Me gustaría saber en qué botón de envío se hizo clic sin aplicar un .click()
evento a cada uno.
Aquí está la configuración:
<html>
<head>
<title>jQuery research: forms</title>
<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>
<script type='text/javascript' language='javascript'>
$(document).ready(function(){
$('form[name="testform"]').submit( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var me = event.currentTarget;
var data = me.data.value;
var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
</script>
</head>
<body>
<h2>Here's my form:</h2>
<form action='nothing' method='post' name='testform'>
<input type='hidden' name='data' value='blahdatayadda' />
<input type='submit' name='name1' value='value1' />
<input type='submit' name='name2' value='value2' />
</form>
</body>
</html>
Además de aplicar un evento .click () en cada botón, ¿hay alguna forma de determinar en qué botón de envío se hizo clic?
name
?Respuestas:
Hice esta misma pregunta: ¿Cómo puedo obtener el botón que provocó el envío desde el evento de envío de formulario?
Terminé ideando esta solución y funcionó bastante bien:
En su caso con múltiples formularios, es posible que deba modificar esto un poco, pero aún debería aplicarse
fuente
Encontré que esto funcionó.
fuente
Esto funciona para mi:
fuente
id
de loactiveElement
que hice$(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
no es la entrada. En mi caso, es un div modal (que contiene el formulario).Cuando se envía el formulario:
document.activeElement
le dará el botón de enviar en el que se hizo clic.document.activeElement.getAttribute('value')
le dará el valor de ese botón.fuente
Aquí está el enfoque que parece más limpio para mis propósitos.
Primero, para cualquiera y todas las formas:
Cuando se activa este evento de clic para un formulario, simplemente registra el destino de origen (disponible en el objeto de evento) para acceder más tarde. Este es un trazo bastante amplio, ya que se disparará por cualquier clic en cualquier parte del formulario. Los comentarios de optimización son bienvenidos, pero sospecho que nunca causará problemas notables.
Luego, en
$('form').submit()
, puede preguntar en qué se hizo clic por última vez, con algo comofuente
return false
, mientras que este método funciona correctamente ya que el clic está vinculado al formulario en lugar de a sus elementos secundarios.... $(event.target))
pero no se puede editar porque las ediciones deben ser> 6 caracteres¡Guau, algunas soluciones pueden complicarse! Si no le importa usar un simple global, solo aproveche el hecho de que el evento de clic del botón de entrada se dispara primero. Uno podría filtrar aún más el selector $ ('input') para uno de los muchos formularios utilizando $ ('# myForm input').
fuente
He encontrado que la mejor solución es
Esto no solo funciona en las entradas, sino que también funciona en las etiquetas de los botones. También obtiene la identificación del botón.
fuente
$(document.activeElement).attr('id')
regresaundefined
Otra posible solución es agregar un campo oculto en su formulario:
Luego, en la función listo, agregue funciones para registrar qué tecla se presionó:
Ahora, en el controlador de envío de formularios, lea la variable oculta y decida en función de ella:
fuente
Sobre la base de lo que hicieron Stan y Yann-h, pero este predeterminado es el primer botón. La belleza de este enfoque general es que recoge tanto el clic como la tecla Intro (incluso si el foco no estaba en el botón. Si necesita permitir ingresar en el formulario, simplemente responda a esto cuando un botón esté enfocado ( es decir, la respuesta de Stan.) En mi caso, quería permitir que ingrese para enviar el formulario, incluso si el foco actual del usuario estaba en el cuadro de texto.
También estaba usando un atributo 'nombre' en lugar de 'id', pero este es el mismo enfoque.
fuente
Este me funcionó
fuente
Si lo que quiere decir al no agregar un evento .click es que no desea tener controladores separados para esos eventos, puede manejar todos los clics (envíos) en una función:
fuente
event.preventDefault
o haga algo comoinput.parents("form")[0].submit()
.Como no puedo comentar sobre la respuesta aceptada, traigo aquí una versión modificada que debe tener en cuenta los elementos que están fuera del formulario (es decir, adjuntos al formulario usando el
form
atributo). Esto es para el navegador moderno: http://caniuse.com/#feat=form-attribute . Elclosest('form')
se utiliza como reserva para unform
atributo no compatiblefuente
"button,[type=submit]"
agregar campo oculto
fuente
button[type=submit]
yinput[type=image]
.Para mí, la mejor solución fue esta:
fuente
Al trabajar con esta excelente respuesta , puede verificar el elemento activo (el botón), agregar una entrada oculta al formulario y, opcionalmente, eliminarlo al final del controlador de envío.
Nota al margen: personalmente agrego la clase
form-js
en todos los formularios que se envían a través de JavaScript.fuente
Similar a la respuesta de Stan pero:
fuente
Esta es la solución utilizada por mí y funciona muy bien:
fuente
Me ayudó https://stackoverflow.com/a/17805011/1029257
Formulario enviado solo después de hacer clic en el botón Enviar.
fuente
Aquí está mi solución:
fuente
También hice una solución, y funciona bastante bien:
utiliza jQuery y CSS
Primero, hice una clase CSS rápida, esta puede ser incrustada o en un archivo separado.
A continuación, en el evento de clic de un botón dentro del formulario, agregue la clase CSS al botón. Si el botón ya tiene la clase CSS, elimínelo. (No queremos dos clases CSS [Por si acaso]).
Ahora, pruebe el botón para ver que tiene la clase CSS, si el botón probado no tiene el CSS, entonces el otro botón sí.
¡Espero que esto ayude! ¡Salud!
fuente
button[type=submit]
yinput[type=image]
.hasClass()
yremoveClass()
son redundantes, yaaddClass()
que no agregarán la misma clase dos veces.Puede crear input type = "hidden" como titular de la información de identificación de un botón.
En este caso, el formulario pasa el valor "1" (identificación de su botón) al enviar. Esto funciona si onClick ocurre antes de enviar (?), Lo que no estoy seguro si siempre es cierto.
fuente
Una forma simple de distinguir qué <botón> o <input type = "button" ...> se presiona, verificando su 'id':
fuente
Aquí hay una muestra que usa this.form para obtener la forma correcta en la que se envía el envío, y campos de datos para almacenar el último elemento seleccionado / enfocado. También envolví el código de envío dentro de un tiempo de espera para asegurarme de que los eventos de clic suceden antes de que se ejecute (algunos usuarios informaron en los comentarios que en Chrome a veces se dispara un evento de clic después de un envío).
Funciona cuando se navega tanto con las teclas como con el mouse / dedos sin contar con los navegadores para enviar un evento de clic en la tecla RETURN (aunque no duele), agregué un controlador de eventos para eventos de enfoque para botones y campos.
Puede agregar botones de tipo = "enviar" a los elementos que se guardan al hacer clic.
En la demostración, configuré un borde rojo para mostrar el elemento seleccionado y una alerta que muestra el nombre y el valor / etiqueta.
Aquí está el violín
Y aquí está el (mismo) código:
Javascript:
HTML DUMMY:
CSS DUMB:
fuente
Escribo esta función que me ayuda
y luego usar
fuente
fuente
Desea usar window.event.srcElement.id de esta manera:
para un botón que se parece a:
recibirá una alerta que dice: "el elemento en el que se hizo clic fue myButton.
En su ejemplo mejorado, puede agregar window.event.srcElement a process_form_submission y tendrá una referencia a cualquier elemento invocado en el proceso.
fuente