2010-07-06 13 views
7

estoy tratando de realizar un formulario de envío básica, pero los siguientes somete al servidor dos veces en Chrome y Safari (pero se comporta como se espera en Firefox):formulario presentado dos veces en Chrome/Safari

<form id="create-deck-form" action="/decks/create" method="post"> 
    <fieldset> 
    <legend>Create new deck</legend> 
    <label for="deck-name-field">Name</label> 
    <input id="deck-name-field" name="deck-name-field" type="text" value="" maxlength="140" /> 

    <label for="tag-field">Tags</label> 
    <input id="tag-field" name="tag-field" type="text" value="" maxlength="140" /> 

    <input class="add-button" type="submit" value="Create" /> 
    </fieldset> 
</form> 

lo haría desea utilizar el atributo onsubmit para realizar la validación en los campos antes del envío, pero donde sea que el valor devuelto sea true, el formulario se envía dos veces.

he tratado de obligar a un controlador de jQuery para la forma, pero aquí también, donde no se impida el comportamiento por defecto, el formulario se envía dos veces, por ejemplo:

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#create-deck-form").submit(function(event){ 
      if($("#deck-name-field").val() == "") { 
      event.preventDefault(); 
      alert("deck name required"); 
      } 
     }); 
}); 
</script> 

Aunque supongo que hay algo deslumbrante Obvio error aquí con un nuevo par de ojos, estoy profundamente confundido por qué el envío, con o sin validación, hace una publicación duplicada en el servidor en Chrome y Safari. Estaría agradecido por cualquier idea.

+0

¿Hay algo más involucrado? ¿Hay controladores de "clic" que invoquen explícitamente "submit()" en el formulario, por ejemplo? – Pointy

+0

Gracias, puntiagudo. No, está perfectamente limpio en este momento, sin otros manejadores atados a la forma o sus botones. – meg

+0

¿Tiene una página de ejemplo o publica los contenidos de su página en algún lugar (todos HTML y JS), para que podamos echarle un vistazo? –

Respuesta

3

Este problema está realmente asociado con Facebox (http://defunkt.github.com/facebox/). La inicialización de Facebox causa un segundo conjunto de solicitudes después de que se carga su página. Por lo tanto, si publica en /myaction/create, Facebox iniciará un segundo conjunto de solicitudes con la URL base establecida en /myaction/create. Una solución es redirigir a una URL que maneja las solicitudes de obtención después de hacer una publicación, por lo que no termina realizando la publicación dos veces. Muchas gracias por su ayuda.

+1

Parece que tengo el mismo problema, ¿tiene el código (o una descripción global) de su solución? ¿Cómo redirigió el mensaje después de la publicación? –

0

Puede intentar return false; después de su alerta y eliminar event.preventDefault();. Tal vez también necesite return true; en su cláusula adicional. Creo que tengo eso trabajando en algún lado.

+0

Gracias, Koen. Cuando la validación falla, el comportamiento es bueno (y sí, event.preventDefault() o return false; se realiza como se espera). Dondequiera que la validación pase, el formulario se envía dos veces. Este es el caso donde el comportamiento predeterminado se llama explícitamente (utilizando una cláusula else para devolver verdadero) o se llama implícitamente al no impedir que el valor predeterminado/devuelva falso (como en los fragmentos de código anteriores). – meg

+0

¿Ha intentado utilizar un método no anónimo (definiéndolo con un nombre) y usándolo como un atributo, por ejemplo,

. Si eso también se publica dos veces, el problema está en otro lugar en su código ... – Koen

+0

Claro que sí @Koen, gracias. ¿No fue la presentación del formulario lo que causó el problema, solo de dónde podría comenzar el fenómeno? – meg

1

no estoy 100% seguro, pero por favor, intente éste:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#create-deck-form").submit(function(event){ 
     if(!$("#deck-name-field").val().length) { 
      return false; 
     } 
     }); 
    }); 
</script> 

si eso no funciona, por favor, eche un vistazo a

for(e in $("#create-deck-form").data('events')) 
    alert(e); 

Esto alertará que todos los acontecimientos que están obligados a su form. Tal vez hay más controladores de eventos? De lo contrario también alerta/log

$("#create-deck-form").attr('onclick') 

y

$("#create-deck-form").attr('onsubmit') 

por si acaso.

+0

Sí, estoy seguro de que necesita devolver el mensaje falso para que el evento predeterminado del navegador también ocurra – Tom

+0

Gracias Andy y Tom. Creo que puedo haber confundido el problema al mencionar la validación. Donde la validación falla, estoy bien (evento.preventDefault es equivalente a devolver falso y ambos están bien) es cuando el formulario se envía sin problemas de validación que me da problemas. Por lo tanto, como muestro arriba en el primer fragmento de código, el envío del formulario básico sin validación o la participación de JS se envía al servidor dos veces. Una gran idea sobre la búsqueda de cualquier controlador malicioso asociado con el formulario, Andy, voy a intentarlo. – meg

+0

@meg: no exactamente, al devolver 'false' de un controlador de eventos se activan ambos,' preventDefault' más 'stopPropagation'. – jAndy

0

Ok, no estoy seguro de cuánto esto ayudará, pero intente eliminar la entrada de envío y enviar el formulario a través de javascript. Así, por ejemplo

<input id="submit-button" class="add-button" type="button" value="Create" /> 

Entonces, en lugar de escuchar el onsubmit, puede intentar

$('#submit-button').click(function(evt) { 
    if(validationSuccess(...)) { 
     $("#create-deck-form").submit(); 
    } else { 
     //display whatever 
    } 
}); 

Ahora estás debería funcionar también ... pero de esta manera se puede depurar donde estás problema es .... Esto solo debe enviarse una vez ... ¡buena suerte!

+0

Gracias JavaDrinker, de hecho he intentado este enfoque en vano. He estado cavando y puede ser algo mucho más profundo en mi aplicación. Espero resolver hoy y publicar la resolución. – meg

+0

Esto quizás sea una pregunta tonta pero: ¿cómo determina que su formulario se presente dos veces? Quiero decir, ¿cuál es el resultado de este "doble envío"? –

+0

Puedo ver en mi consola que hay dos solicitudes para el servidor y hay una segunda cubierta visible en el almacén de datos. Resultó que no era la presentación del formulario, pero ahí es donde el comportamiento podría ser expulsado: ¡arenque rojo! – meg