2013-01-17 23 views
52

Gönderildiğinde, formu göndermeden önce ek bir işlem yapmam gereken bir form var. Varsayılan form gönderim davranışını önleyebilirim, ardından ek işlemlerimi yapın (temelde Google Haritalar API'sını çağırmak ve forma birkaç gizli alan eklemek) - ve sonra gönderilecek forma ihtiyacım var.jQuery - varsayılanı engelle, sonra da varsayılan olarak devam et

"Varsayılanı önleme" nin bir yolu var mı, sonra bir nokta daha sonra "varsayılana devam et"?

+2

Bu bir dupe, sadece bulamıyor: - /. Uzun lafın kısası, etkinliği tekrar tetiklemeniz ve varsayılan eylemi ikinci kez engellememeniz gerekir (bir bayrak kullanın). –

+0

@FelixKling Bunu mu demek istediniz: http://stackoverflow.com/questions/7610871/how-to-trigger-an-event-after-using-event-preventdefault? –

cevap

13

ben sadece ilk başta ..

$('#submiteButtonID').click(function(e){ 
    e.preventDefault(); 
    //do ur stuff. 
    $('#formId').submit(); 
}); 

çağrı preventDefault yapacağını ve u sadece mevcut işlemi durdurur

+0

, tıklama etkinliği işleyicinizin içinde mantığı içermez. bunu başkalarına devretmek. –

+0

i katılıyorum .. :) .. öneri için teşekkürler ... – bipen

+20

Bu, bir düğmeyi tıklayacağınızı varsayar. Kullanıcı formun içinden "gir" düğmesine isabet ederse ne olur? Bu formu da gönderecek. Bu yüzden, gönder düğmesini tıklama aldığınıza güvenmek iyi bir fikir olmayabilir. – StackOverflowNewbie

2

Sen e.preventDefault() kullanabilirsiniz formu göndermeniz gerekirse .. submit() işlevi daha sonra kullanmak .

forma .submit() olayı bağlamak ve siz (gerçek) dönmeden önce yapmak istediğiniz şeyleri yapmak zaman $("#form").submit();

$('#form').submit(function (e) 
{ 
    return !!e.submit; 
}); 
if(blabla...) 
{... 
} 
else 
{ 
    $('#form').submit(
    { 
     submit: true 
    }); 
} 
36

yapabilirsiniz daha bunları gerçek sunulmadan önce olur. Örneğin

: http://api.jquery.com/submit/#entry-examples

+1

'u tıklatırsanız, formun "true true" dan önce tüm kodları alana kadar göndermeyeceğini söyler misiniz? ifade yürütülür? – arvinsim

+1

Evet, tam olarak [submit()] (http://api.jquery.com/submit/#entry-examples) işlevinin yaptığı şeydir. –

+3

Bu, senkronize olduğundan emin olmak için iyi bir örnek değil. Yapmam gereken şey asenkron çağrı mı? Bu durumda, "gönder 'i tıklatma -> zaman uyumsuz şeyler yap ve formu göndermeyin -> async geri aramada formdaki bazı alanları doldur -> formu geri bildirimi gönder" –

8

Sizin JS üzerinde sonsuz döngü yapacak bu şekilde kullanarak: jquery.com üzerine

$('form').submit(function(){ 
    alert('I do something before the actual submission'); 
    return true; 
}); 

Simple example

başka örnek.

var on_submit_function = function(evt){ 
    evt.preventDefault(); //The form wouln't be submitted Yet. 
    (...yourcode...) 

    $(this).off('submit', on_submit_function); //It will remove this handle and will submit the form again if it's all ok. 
    $(this).submit(); 
} 

$('form').on('submit', on_submit_function); //Registering on submit. 

Ben yardımcı olur umarım aşağıdaki kullanabileceğiniz daha iyi bir yol yapmak! Teşekkürler!

+0

en iyi yol aslında, async işleviyle varyasyon - https://gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef – bjornmelgaard

+0

@bjornmelgaard Async'in [standart dışı] olduğunu hatırlamamız gerekiyor (https://developer.mozilla.org/ tr/docs/Web/API/Belge/uyumsuz). –

17

Kullanım jQuery.one()

elemanları bir etkinliğe bir işleyici takın. işleyici etkinlik türü

$('form').one('submit', function(e) { 
    e.preventDefault(); 
    // do your things ... 

    // and when you done: 
    $(this).submit(); 
}); 

Ne istediğinizi yapar ve birden gönderme konusunda endişelenmenize gerek yoktur birer defa elemanı başına en fazla yürütülür.

+0

Bu en basit cevaptır, teşekkürler! – Eckstein

0

"Doğrulama enjeksiyon döngü gönderirim olmadan":

Sadece ReCAPTCHA ve HTML5 doğrulama önce bazı başka şeyler kontrol etmek istiyorum, bu yüzden böyle bir şey (doğrulama işlevi true veya false döndürür) yaptı:

$(document).ready(function(){ 
    var application_form = $('form#application-form'); 

    application_form.on('submit',function(e){ 

     if(application_form_extra_validation()===true){ 
      return true; 
     } 

     e.preventDefault(); 

    }); 
}); 
0

Düzgün bir Javascript biçiminde, önbelleği önledikten sonra formu gönderebilirsiniz. Bu, HTMLFormElement.submit()never callsonSubmit()'dan kaynaklanmaktadır. Bu nedenle, formu özel bir onsubmit işleyicisine sahip değil gibi sunmak için söz konusu şartname tuhaflığına güveniyoruz.Eşzamanlı bir istek için bkz this fiddle. bitirmek için bir zaman uyumsuz isteği bekliyorum


gibi kolaydır:

var submitHandler = (event) => { 
    event.preventDefault() 
    console.log('before') 
    setTimeout(function() { 
    console.log('done') 
    document.getElementById('formId').submit() 
    }, 1400); 
    console.log('after') 
} 

Bir asenkron isteğinin bir example benim keman bakabilirsiniz.


Ve vaatlerle düşerse:

var submitHandler = (event) => { 
    event.preventDefault() 
    console.log('Before') 
    new Promise((res, rej) => { 
     setTimeout(function() { 
     console.log('done') 
     res() 
     }, 1400); 
    }).then(() => { 
     document.getElementById('bob').submit() 
    }) 
    console.log('After') 
} 

Ve burada that request bu.

İlgili konular