2010-07-06 21 views
7

szukam do wykonywania podstawowej formie post, ale następujące przekazuje do serwera dwukrotnie w Chrome i Safari (ale zachowuje się zgodnie z oczekiwaniami w Firefoksie):Formularz składać dwa razy w 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> 

bym lubię używać atrybutu onsubmit do sprawdzania poprawności pól przed przesłaniem, ale jeśli wartość zwracana to true, formularz jest wysyłany dwa razy.

starałem się powiązać obsługi jQuery do formy, ale i tu, gdzie domyślne zachowanie nie jest zabezpieczony, formularz jest przesyłany dwa razy, na przykład:

<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> 

Choć przypuszczam, że coś jest oślepiająco Oczywistym błędem jest świeża para oczu, jestem głęboko zmieszany, dlaczego przesyłanie, z lub bez sprawdzania poprawności, powoduje duplikowanie postu na serwerze w przeglądarce Chrome i Safari. Byłbym wdzięczny za każdy wgląd.

+0

Czy jest coś jeszcze? Czy istnieją jakieś programy obsługi "click", które jawnie wywołują "submit()" w formularzu, na przykład? – Pointy

+0

Dzięki, Pointy. Nie, w tej chwili są to zupełnie nagie kości, bez żadnych innych uchwytów związanych z formą lub przyciskami. – meg

+0

Czy masz przykład strony lub opublikować zawartość strony (wszystkie HTML i JS), abyśmy mogli zobaczyć? –

Odpowiedz

3

Ten numer jest aktualnie związany z Facebox (http://defunkt.github.com/facebox/). Inicjalizacja Faceboksa powoduje drugi zestaw żądań po wczytaniu strony. Jeśli więc opublikujesz pod numerem /myaction/create, Facebox rozpocznie drugi zestaw żądań z podstawowym adresem URL ustawionym na /myaction/create. Rozwiązaniem jest przekierowanie do adresu URL, który obsługuje żądania pobierania po wykonaniu postu, więc nie kończysz go dwukrotnie. Bardzo dziękuję za pomoc.

+1

Mam ten sam problem, czy masz kod (lub globalny opis) rozwiązania, w jaki sposób przekierowałeś get po poście? –

0

Po sygnale możesz spróbować return false; i usunąć event.preventDefault();. Być może potrzebujesz również return true; w swoim drugim zdaniu. Wierzę, że mam to gdzieś działa.

+0

Dziękuję, Koen. Gdy sprawdzanie poprawności nie powiedzie się, zachowanie jest dobre (i tak, albo event.preventDefault(), albo zwraca false, wykonaj zgodnie z oczekiwaniami). Tam, gdzie zatwierdzenie przechodzi, formularz jest składany dwukrotnie. Jest tak w przypadku, gdy domyślne zachowanie jest jawnie wywoływane (przy użyciu else-clause, aby zwrócić true) lub niejawnie wywoływane, nie zapobiegając domyślnemu/powrotnemu fałszowi (jak w opisach kodów powyżej). – meg

+0

Czy próbowałeś użyć metody nieanonimowej (definiując ją nazwą) i używając jej jako atrybutu, np .:

. Jeśli to również publikuje dwa razy, problem jest gdzie indziej w twoim kodzie ... – Koen

+0

Pewnie zrobiłeś @Koen, dzięki. Czy przesłanie formularza nie spowodowało problemu, tylko od czego może zacząć się dziwactwo? – meg

1

nie jestem w 100% pewien, ale spróbuj to jedno:

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

jeśli to nie zadziała, proszę spojrzeć na

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

To ostrzec wszystkie wydarzenia, które są powiązane z Twoim form. Może jest więcej programów obsługi zdarzeń? W przeciwnym razie również alarm/log

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

i

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

na wszelki wypadek.

+0

Tak, ale na pewno musisz zwrócić wartość false, aby zatrzymać domyślne zdarzenie przeglądarki. – Tom

+0

Dzięki Andy i Tom. Myślę, że mogłem pomylić ten problem, wspominając o walidacji. Tam, gdzie walidacja się nie powiedzie, jestem w porządku (zdarzenie.preventDefault jest równoważny zwrotowi false, a oba są w porządku), gdy formularz przesyła się bez problemów z weryfikacją, co powoduje problemy. Tak więc, jak pokazałem powyżej w pierwszym fragmencie kodu, podstawowe przesłanie formularza bez walidacji lub zaangażowania JS składa się na serwer dwa razy. Świetny pomysł na sprawdzenie wszelkich nieuczciwych handlerków związanych z formularzem, Andy, spróbuję. – meg

+0

@meg: niezupełnie, zwracanie 'false' z procedury obsługi zdarzenia wyzwala oba,' preventDefault' plus 'stopPropagation'. – jAndy

0

OK, nie jestem pewien, ile to pomoże, ale spróbuj usunąć dane do przesłania i przesłać formularz za pomocą javascript. Tak na przykład

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

wówczas zamiast słuchania onSubmit, można spróbować

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

Teraz jesteś tak powinno działać zbyt ... ale w ten sposób można debugować gdzie jesteś problemem jest .... To powinno się składać tylko raz ... Powodzenia!

+0

Dzięki JavaDrinker, rzeczywiście próbowałem tego podejścia bez skutku. Kopałem i może to być coś znacznie głębszego w mojej aplikacji. Mam nadzieję rozwiązać dzisiaj i opublikować rezolucję. – meg

+0

To może głupie pytanie, ale: jak określasz, że twój formularz jest przesyłany dwa razy? Mam na myśli, jaki jest rezultat tego "podwójnego poddania"? –

+0

Widzę w mojej konsoli wydrukować, że istnieją dwa żądania do serwera i jest druga widoczna w magazynie danych. Okazało się, że to nie jest podanie formularza, ale właśnie w tym miejscu można zacząć działać - czerwony śledź! – meg

Powiązane problemy