2008-09-26 17 views
33

Tengo una página con un formulario normal con un botón de enviar y jQuery que se une al evento de envío de formulario y lo reemplaza con e.preventDefault() y ejecuta un AJAX mando. Esto funciona bien cuando se hace clic en el botón Enviar, pero cuando se hace clic en un enlace con onclick='document.formName.submit();', el evento no es detectado por el manejador de eventos de envío de formularios AJAX. ¿Alguna idea de por qué no o cómo hacer que funcione sin obligar a todos los elementos?jQuery anular formulario enviar no funciona cuando enviar llamado por javascript en un elemento

Respuesta

35

Un par de sugerencias:

  • sobrescribir la función para hacer su hacer una oferta mal

    var oldSubmit = form.submit; 
    form.submit = function() { 
     $(form).trigger("submit"); 
     oldSubmit.call(form, arguments); 
    } 
  • ¿Por qué no se unen a todos los <un> Etiquetas enviar? Entonces usted no tiene que hacer ninguna parches mono, y podría ser tan simple como (suponiendo que todos los enlaces están dentro de la etiqueta del formulario):

    $("form a").click(function() { 
     $(this).parents().filter("form").trigger("submit"); 
    }); 
+2

¿Qué significa 'forma' en el primer ejemplo? – tishma

+0

@tishma El elemento DOM de formulario, como en este ejemplo: http://stackoverflow.com/a/931482/1048862 – Matt

+0

Esto no funcionará en algunos navegadores más antiguos. JS. La propiedad de envío es la razón. Use $(). Submit (function() {...}); en lugar. –

11

Si está utilizando jQuery, debe adjuntar eventos a través de su propio event mechanism y no mediante el uso de propiedades "on" (onclick etc.). También tiene su propio método de activación de eventos, acertadamente llamado 'trigger', que debe usar para activar el evento de envío de formularios.

+0

Estoy de acuerdo, no use código obtrusivo en su código, solo lo hace para dolores de cabeza si está mezclando JavaScript discreto con él. –

1

Gracias Eran

estoy utilizando este código de enlace

this._form.bind('submit', Delegate.create(this, function(e) { 
    e.preventDefault(); 
    this._searchFadeOut(); 
    this.__onFormSubmit.invoke(this, new ZD.Core.GenericEventArgs(this._dateField.attr('value'))); 
}); 

evento pero no hay código de legado onclick en el HTML y yo preferiría no cambiar, ya que hay tan muchos enlaces.

+0

El problema es que al llamar al método submit() del formulario no se activará el evento. Es lo mismo con un método input focus(): simplemente no pasan por la cadena de delegación de eventos normal. –

1

Esto funcionó para mí:

Hacer un botón ficticio, ocultar el verdadero presente con el nombre someterse,

y luego:

$("#mySubmit").click(function(){ 
    $("#submit").trigger("click"); }); 

establecer un controlador de eventos en su maniquí para disparar clic en el fo rm enviar botón. deje que el navegador descubra cómo enviar el formulario ... De esta manera no necesita preventDefault en el formulario enviado, que es donde comienza el problema.

Esto pareció solucionar el problema.

Cuestiones relacionadas