2010-07-06 27 views
7

Ben bir temel formu görevi yapmak için arıyorum iki kez sunulan Formu ama Chrome ve Safari iki kez sunucuya aşağıdaki Gönderilmesi (Firefox'ta beklendiği gibi ama davranır):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> 

isterim Gönderme öncesi alanlarda doğrulama yapmak için onsubmit özniteliğini kullanmak ister, ancak dönüş değeri true olduğu yerde, form iki kez gönderilir.

Ben formu, iki kez gönderildiğinde, varsayılan davranış törpülenmediği, burada da forma jQuery işleyicisi bağlamak için aranan, ama örneğin:

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

Ben kör edici bir şey olduğunu varsayalım iken Burada yeni bir çift göze çarpan yanlış bir şekilde, onaylama ile veya doğrulama olmadan gönderim işleminin Chrome ve Safari'deki sunucuya neden bir gönderi yaptığını derinden karıştırdım. Herhangi bir içgörü için minnettar olurum.

+0

Başka bir şey var mı? Örneğin, formda "submit()" öğesini açıkça çağırmak için herhangi bir "tıklama" işleyicisi var mıdır? – Pointy

+0

Teşekkürler, Pointy. Hayır, şu anda tamamen çıplak kemikleridir, başka hiçbir işleyici formu veya düğmelerine bağlı değildir. – meg

+0

Bir örnek sayfanız var mı veya sayfanızın içeriğini bir yere mi (tüm HTML ve JS) gönderiyorsunuz, böylece bir göz atabilir miyiz? –

cevap

3

Bu sorun aslında Facebox (http://defunkt.github.com/facebox/) ile ilişkilendirilmiştir. Facebox başlatma, sayfanız yüklendikten sonra ikinci bir istek grubuna neden olur. Yani, /myaction/create'a posta gönderirseniz, Facebox, temel URL /myaction/create olarak ayarlanmış ikinci bir istek kümesi başlatır. Bir düzeltme, bir gönderiyi yaptıktan sonra istekleri yanıtlayan bir URL'ye yönlendirmektir, böylece yayını iki kez gerçekleştirme işlemini bitiremezsiniz. Yardımlarınız için çok teşekkürler.

+1

Aynı sorunu yaşıyorum, çözümünüzün kodunu (veya genel açıklamasını) sahip misiniz, postadan sonra nasıl yönlendirme yaptınız? –

0

Uyarıdan sonra return false; deneyebilir ve event.preventDefault(); kaldır. Belki de başka bir deyişle return true;'a ihtiyacınız var. Sanırım bir yerde çalışıyorum.

+0

Teşekkür ederim, Koen. Doğrulama başarısız olduğunda, davranış her şey iyidir (ve evet, ya event.preventDefault(); ya da false döndür; beklendiği gibi gerçekleştirin). Doğrulama geçer geçmez, form iki kez gönderilir. Bu, varsayılan davranışın açıkça (true değerini döndürmek için başka bir madde kullanılarak) çağrıldığı veya varsayılan/geri döndürülen false (yukarıdaki kod parçacıklarında olduğu gibi) engellenmeyerek çağrıldığı durumdur. – meg

+0

Anonim olmayan bir yöntem (bunu bir adla tanımlayarak) ve onu bir öznitelik olarak kullanarak denediniz mi: ör.:

. Bu da iki kez gönderirse, sorun kodunuzda başka bir yerde ... – Koen

+0

Elbette, teşekkürler. Soruna neden olan form teslimi değildi, sadece çılgınlığın nereden başlayabileceği. – meg

1

ben% 100 emin değilim, ama kimse bu deneyin: Bu işe yaramazsa,

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

de bakabilirsiniz lütfen

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

Bu size tüm olayları uyaracaktır hangi form'a bağlı. Belki daha fazla olay işleyicisi var? Aksi da uyarı/ihtimale

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

ve

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

açın.

+0

Tarayıcınızın varsayılan olayı da – Tom

+0

olmasını önlemek için false değerini döndürmeniz gerektiğinden emin olun. Teşekkürler Andy ve Tom. Sorunu onaylayarak sorunu karıştırmış olabileceğimi düşünüyorum. Doğrulama başarısız olduğunda iyi (olay.preventDefault, false değerini döndürmekle eşdeğerdir ve her ikisi de iyidir) formun, sorun çıkardığım hiçbir onaylama sorunu olmadan gönderildiği zamandır. Dolayısıyla, ilk kod snippet'inde gösterdiğim gibi, doğrulama veya JS katılımı olmayan temel form gönderimi, sunucuya iki kez gönderir. Formla ilişkili hileli işleyicileri denetleme konusunda harika bir fikir Andy, bir denemem gerekecek. – meg

+0

@meg: tam olarak değil, bir olay işleyicisinden 'false 'döndürme,' preventDefault' artı' stopPropagation'ı tetikler. – jAndy

0

Tamam, bunun ne kadar faydalı olacağından emin değilsiniz, ancak sağlama girişini kaldırmayı ve formu javascript ile göndermeyi deneyin. Yani Ardından Mesela

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

yerine onsubmit dinlemek için, size yol çok çalışması gerektiğini konum Şimdi

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

deneyebilirsiniz ... ama sorun sende bu nerede yolu debug ... Bu sadece bir kez göndermelidir ... iyi şanslar!

+0

Teşekkürler JavaDrinker, gerçekten bu yaklaşımı boşuna denedim. Kazı yaptım ve uygulamamda daha derin bir şey olabilir. Bugün çözmeyi ve kararı vermeyi umuyorum. – meg

+0

Bu belki aptalca bir soru ama: formunuzun iki kez gönderildiğini nasıl belirliyorsunuz? Yani, bu "çifte gönderme" nin sonucu nedir? –

+0

Konsolumda, sunucuda iki istek olduğunu ve veri deposunda görünen ikinci bir destenin olduğunu görebiliyorum. Görünüşe göre form gönderimi değildi, ama davranış bu noktada başlayabilir - kırmızı ringa balığı! – meg