2010-09-07 10 views
5

Tengo una función que estoy usando para evitar las devoluciones de datos múltiples de una forma:¿Cómo puedo encontrar el botón al que se hizo clic desde el evento de envío de formulario en jquery?

var submitted = false; 
$(function() { 
    $('form').bind('submit', function(e) { 
     if (!submitted && CanSubmit(e)) { 
      submitted = true; 
      return true; 
     } else { 
      return false; 
     } 
    }); 
}); 

En el método CanSubmit, tengo que interrogar al botón que se ha hecho clic para determinar si debería permitir que el someter o no .

Tenga en cuenta que no puedo enlazar a eventos específicos de clics; consulte this previous question para obtener más información.

En Firefox, puedo usar e.originalEvent.explicitOriginalTarget, pero aparentemente no está disponible en IE.

¿Cómo puedo obtener este valor del parámetro e de forma cruzada?

+0

¿La función CanSubmit es una función de validación? ¿Por qué te importa qué botón se presionó? ¿Tienes más de un botón en una forma determinada? – Scott

+0

No, en última instancia es una función determinar qué botón se presionó. Me importa porque algunos botones causan publicaciones que están bien (cancelar, inicio, etc.), mientras que otros causan publicaciones que no son (enviar, editar, etc.). Y sí, tengo más de un botón en el formulario. – Damovisa

Respuesta

2

En realidad sólo podría reemplazar $('form').bind('submit' con $(':submit').bind('click' y su código podría funcionar igual de bien (y se podría utilizar this para ver lo que se ha hecho clic).

+0

La pregunta dice: * "Tenga en cuenta que no puedo enlazar a eventos de clics específicos" * – user113716

+0

Correcto: al enlazar al botón se supone que son solo los botones que están causando el envío del formulario – Damovisa

+0

@Damovisa, sí, y es una suposición correcta . Solo los botones de enviar pueden hacer que se envíe un formulario (o javascript submit() llamadas, pero es de suponer que tienes esos bajo control). El selector correcto para ellos es ': submit', not': button', sin embargo, lo arreglé. – Tgr

2

Use e.target - jQuery normalizes it para la consistencia del navegador cruzado.

Lo más parecido que pude encontrar para explicitOriginalTarget fue document.activeElement (para IE) - es el elemento que tuvo foco durante el evento. No hay un equivalente para los navegadores basados ​​en webkit. Así que no, no existe una verdadera forma de navegador cruzado para hacer esto solo con el objeto de evento.

+0

En un controlador 'submit()', 'e.target' se referirá al'

'incluso cuando haga clic en el botón Enviar. Aquí hay un ejemplo: http://jsfiddle.net/zHbrC/ – user113716

+0

@patrick dw: Gracias, solo estaba probando eso.Supongo que el evento no se dispara desde un botón de envío. –

2

¿Por qué no desvincular la función de enviar cuando haces un envío? Esto le garantiza una sola presentación:

$(function() { 
    $('form').bind('submit', function(event) { 
      // regular submit form stuff here 
     ... 
      // and unbind it 
     $('this').unbind(event);  
    }); 
}); 

Pedido .unbind() bajo, "Uso del objeto de evento"

O, como Matt Ball señaló en los comentarios, puede utilizar .one(), que es equivalente a lo anterior.

$(function() { 
    $('form').one('submit', function(event) {   // <== Only executed once 
      // regular submit form stuff here 
     ... 
    }); 
}); 

Si usted tiene la presentación $.post() o $.get() de la forma unida a múltiples eventos/elementos, a continuación, sólo tiene que asegurarse de que desenlazar el controlador que termina siendo utilizado dentro de sí mismo mediante el objeto event y a continuación, desenlazar todos los demás controladores, y viceversa para cada uno de estos otros controladores. Puede desvincular a los otros manejadores usando one of about four methods to unbind event handlers.

+0

Una forma mejor de garantizar la ejecución de un único manejador de eventos: ['jQuery.one()'] (http://api.jquery.com/one). –

+0

@Matt - Buena sugerencia. Sin embargo, no estoy seguro de cómo es mejor, son equivalentes según la documentación '.one()'. –

+0

Claro, son equivalentes, ¿por qué no utilizar el método especialmente diseñado? Es más claro (IMO) y más sucinto. De todos modos, no estaba buscando entrar en un debate al respecto, solo el "uso habitual de lo que ya se ha creado". –

0

Por qué no utilizar la función .one, garantiza que se dispare solo una vez.

$(function() { 
    $('form').one('submit', function(event) { 
     // regular submit form stuff here  
    }); 
}); 
+0

Hmm, es una buena idea, pero creo que esto podría ser lo contrario de lo que necesito, el formulario se enviará a menos que lo detenga, por lo que tendré que ejecutar la función cada vez * excepto * la primera vez. – Damovisa

Cuestiones relacionadas