Estoy tratando de encontrar el valor del botón enviar que activó el formulario para enviar
$("form").submit(function() {
});
Posiblemente podría disparar un evento $ ("input [type = submit]"). Click () para cada botón y establecer alguna variable, pero eso parece menos elegante que cómo quitar el botón del formulario al enviar.
formobj.submit()
. Creo que los eventos de clic son el camino a seguir.event.submitter
que le da el<button>
o en el<input type="submit">
que se hizo clic.Respuestas:
Aproveché
document.activeElement
como se muestra en esta respuesta: ¿Cómo obtener el elemento enfocado con jQuery?Aprovecho el hecho de que el botón siempre es el elemento enfocado después de hacer clic en él. Esto no funcionará si lo hace
blur()
justo después del clic.@Doin ha detectado otro inconveniente. Si un usuario envía el formulario a través
enter
de un campo de texto,document.activeElement
no se establece. Debería tener cuidado con esto usted mismo, manejandokeypress
eventos eninput[type="text"]
y similares.Actualización 2017-01: para mi biblioteca Hyperform , elegí no usar
activeElement
sino capturar todos los eventos que conducen al envío del formulario. El código para esto está en Github.Si usa Hyperform, así es como accedería al botón que activó el envío:
fuente
activeElement
, porque el "remitente" se puede definir: A. Mediante la activación de clic auténtico (se hace clic directamente con el mouse o el teclado Espacio / Intro); B. Mediante activación de clic sintético (buttonElement.click()
obuttonElement.dispatch(new MouseEvent(...))
, sin enfocar); C. a través de envío de formulario implícitamente (interacción del teclado con el campo de otro formulario) D. a ninguno, cuandoformElement.submit()
Implementé esto y supongo que servirá.
y este es el evento del botón de enviar que lo configura
Gracias por las respuestas, pero esto no es tan poco elegante ...
fuente
doNotSubmit
clase, dentro de la función de envío verifique si la clase no existe (de lo contrario, no envíe), dentro del evento de clic elimine la clase de formulariodoNotSubmit
y haga un $ (''. MyForm '). ('enviar'); después de agregar el valor del botón de envío como un campo ocultoCreé un formulario de prueba y usando Firebug encontré esta forma de obtener el valor;
Desafortunadamente, solo Firefox admite este evento.
fuente
Aquí hay un enfoque que parece más limpio para mis propósitos.
Primero, para todas y cada una de las formas:
Cuando se activa este evento de clic para un formulario, simplemente registra el objetivo de origen (disponible en el objeto de evento) para acceder más tarde. Este es un trazo bastante amplio, ya que se activará con 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 consultar en qué se hizo clic por última vez, con algo como
fuente
Ahora hay una
submitter
propiedad estándar en el evento de envío.¡Ya implementado en Firefox 75 !
Para los navegadores que no lo admiten, use este polyfill :
fuente
Según este enlace , el objeto Evento contiene un campo
Event.target
, que:Devuelve una cadena que representa el objeto que inició el evento.
Acabo de crear una página para probar cuál es ese valor, y parece que esa representación es para el formulario en sí, no para el botón en el que se hizo clic. En otras palabras, Javascript no proporciona la posibilidad de determinar el botón en el que se hizo clic.
En cuanto a la solución de Dave Anderson , podría ser una buena idea probarla en varios navegadores antes de usarla. Es posible que funcione bien, pero no puedo decirlo de ninguna manera.
fuente
target
devuelve todo el formulario. Por lo tanto, desafortunadamente, no es útil detectar el botón de envío correcto.Event.target
no es una cadena. Es unEventTarget
objeto, que en este caso es el formulario enviado.Un enfoque limpio es utilizar el evento de clic en cada botón de formulario. A continuación se muestra un formulario html con botones para guardar, cancelar y eliminar:
A continuación se muestra el archivo jquery. Envío la 'acción' apropiada a la misma función del servidor según el botón en el que se hizo clic ('guardar' o 'eliminar'). Si se hace clic en 'cancelar', simplemente recargo la página.
fuente
Busqué y encontré varias formas de enviar el botón de envío
name
+value
al servidor usando jQuery + AJAX. No me gustaron mucho ...¡Una de las mejores fue la solución de Hunter presentada aquí!
Pero yo mismo escribí otro.
Quiero compartir, porque es bueno y, según lo necesitaba, también funciona con formularios cargados a través de ajax (después de document.ready):
¡Sencillo! Cuando se hace clic en el botón enviar, se agrega un campo oculto al formulario, utilizando el mismo
name
yvalue
del botón enviar.EDITAR: La versión a continuación es más fácil de leer. Además, se encarga de eliminar los campos ocultos previamente añadidos (en el caso de enviar el mismo formulario dos veces, lo cual es perfectamente posible cuando se usa AJAX).
Código mejorado:
fuente
<button/>
s compartan el mismoname
atributo. Usaría una clase y me referiría a eso en su.remove()
.name
atributo. Si el formulario se reutiliza y contiene entradas de envío con nombres diferentes, las entradas antiguas pueden saturar el formulario.<button/>
elemento, mientras que<input type="submit" />
se usa en el código ...)Probé algunos de los ejemplos proporcionados, pero no funcionaron para nuestros propósitos.
Aquí hay un violín para mostrar: http://jsfiddle.net/7a8qhofo/1/
Me enfrenté a un problema similar, y así es como resolvimos el problema en nuestros formularios.
fuente
(evento)
fuente
puede probar de esta manera con "event.originalEvent.x" y "event.originalEvent.y":
fuente
jQuery no parece proporcionar esos datos sobre el evento de envío. Parece que el método que propuso es su mejor opción.
fuente
Solo otra solución, ya que ninguna otra cumplía mis requisitos. La ventaja es que se detectan los clics y las pulsaciones de teclas (enter y espacio) .
Esto funcionó mejor para mí.
fuente
Con un controlador de eventos más específico y JQuery, su objeto de evento es el botón en el que se hace clic. También puede obtener el formulario de delegación de este evento si es necesario.
Este documento tiene todo lo que necesita para comenzar. JQuery Doc .
fuente
Escribo esta función que me ayuda
y luego usar
fuente