jQuery - varsayılanı engelleyin, ardından varsayılana devam edin


104

Gönderildiğinde, formu göndermeden önce bazı ek işlemler yapmam gereken bir formum var. Varsayılan form gönderme davranışını önleyebilirim, ardından ek işlemlerimi yapabilirim (temelde Google Haritalar API'sini çağırıyor ve forma birkaç gizli alan ekliyor) - ve sonra göndermem için forma ihtiyacım var.

"Varsayılanı engellemenin" bir yolu var mı, daha sonra bir nokta "varsayılana devam et" mi?


@FelixKling Yani stackoverflow.com/questions/7610871/… mi demek istediniz ?
M.Mimpen

Yanıtlar:


54

Kullanım jQuery.one()

Öğeler için bir olaya bir işleyici ekleyin. İşleyici, olay türü başına öğe başına en fazla bir kez yürütülür

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

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

oneBu özel submitolay ilk gönderimden sonra çıkarıldığından, sonsuz döngüyü de engellemenin kullanımı .


2
tekrar tıkladıktan sonra gönderilecek :(
merak

1
Muhtemelen sonsuz döngü ile karşılaşacaksınız
Mehrdad HosseinNejad

Sonsuz döngü, işlev .one olmamalıdır
sgvolpe

53

.submit()Olayı forma bağladığınızda ve geri dönmeden önce yapmak istediğiniz şeyleri yaptığınızda (doğru), bunlar gerçek gönderimden önce gerçekleşir.

Örneğin:

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

Basit örnek

Jquery.com'daki başka bir örnek: http://api.jquery.com/submit/#entry-examples


2
formun "dönüş doğru" dan önceki tüm kodlara kadar gönderilmeyeceğini mi söylüyorsunuz; ifadesi yürütüldü mü?
developmentarvin

2
Evet, submit () işlevinin yaptığı tam olarak budur .
Ron van der Heijden

8
Eşzamanlı olduğu için iyi bir örnek değil. Ya yapmam gereken şey eşzamansız çağrı ise? Durum şu şekildedir: "gönder'i tıklayın -> eşzamansız şeyler yapın ve formu gönderin -> eşzamansız geri aramada formdaki bazı alanları doldurun -> geri aramadan formu gönderin"
The Godfather

1
Zaman uyumsuz jQuery kodu çalıştırmaya ne dersiniz ?! Da çalışacak mı?
mumluk

bu benim için harika çalışıyor. Bunu göndermeden önce şeyleri kontrol etmek için kullanıyorum ve işler doğru değilse "yanlış döndür" kullanıyorum. Bu çözümü bir gün aradım. çok teşekkürler.
livefreeor

26

Sadece yapardım:

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

preventDefaultİlk önce arayın ve submit()daha sonra formu göndermeniz gerekiyorsa işlevi kullanın


tıklama olay işleyicinizin içine mantık dahil etmeyin. sorumluluğu başkalarına devretmek.
Royi Namir

27
Bu, kesinlikle bir düğmeyi tıklayacağını varsayar. Ya kullanıcı formun içinden "giriş" düğmesine basarsa? Bu aynı zamanda formu da gönderecektir. Bu nedenle, gönder düğmesinin tıklanmasına güvenmek muhtemelen iyi bir fikir değildir.
StackOverflowNewbie

sadece bir tıklama örneği vermiştim ... soruda belirtilen ilgili kodlar olmadığı için ....
bipen

2
Her durumda, verdiğiniz pasaj yalnızca kullanıcı bir düğmeyi tıkladığında çalışacaktır. Formlar böyle çalışmaz. Başka öneriniz var mı?
StackOverflowNewbie

tıklamayı
bağlayın

18

Bu şekilde kullanarak JS'nizde sonsuz bir Döngü yapacaksınız. daha iyi bir yol yapmak için aşağıdakileri kullanabilirsiniz

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.

Umut ediyorum bu yardım eder! Teşekkürler!


aslında en iyi yol, eşzamansız işlevle varyasyon - gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef
srghma

@bjornmelgaard Async'in standart olmadığını hatırlamam gerekiyor .
Valerio Bozz

6

Bu, IMHO, en genel ve sağlam çözümdür (eylemleriniz kullanıcı tarafından tetikleniyorsa, örneğin 'kullanıcı bir düğmeyi tıklarsa'):

  • işleyiciye ilk kez çek denildiğinde, WHO tarafından tetiklendi:
    • Eğer bir kullanıcı tigging yaptıysa - işinizi yapın ve sonra tekrar tetikleyin (isterseniz) - programlı olarak
    • aksi takdirde - hiçbir şey yapma (= "varsayılana devam et")

Örnek olarak, "Emin misiniz?" herhangi bir düğmeyi bir öznitelikle süsleyerek açılır. Kullanıcı vazgeçmezse koşullu olarak varsayılan davranışa devam edeceğiz.

1. İstediğimiz her düğmeye "emin misiniz" açılır penceresinden bir uyarı metni ekleyelim:

<button class="btn btn-success-outline float-right" type="submit"  ays_text="You will lose any unsaved changes... Do you want to continue?"                >Do something dangerous</button>

2. İşleyicileri bu tür TÜM düğmelere ekleyin:

$('button[ays_text]').click(function (e, from) {
    if (from == null) {  // user clicked it!
        var btn = $(this);
        e.preventDefault();
        if (confirm() == true) {
            btn.trigger('click', ['your-app-name-here-or-anything-that-is-not-null']);
        }
    }
    // otherwise - do nothing, ie continue default
});

Bu kadar.


1
Mükemmel cevap! .Trigger () 'e fazladan bir argüman iletebileceğinizi bilmiyordum
James Hibbard

5
$('#myform').on('submit',function(event){
  // block form submit event
  event.preventDefault();

  // Do some stuff here
  ...

  // Continue the form submit
  event.currentTarget.submit();
});

3

İle jQueryve @ Joepreludian cevabı yukarıda küçük bir varyasyonu:

Unutulmaması gereken önemli noktalar:

  • .one(...) bunun yerine .on(...) or .submit(...)
  • namedyerine işlev anonymous functionbiz içinde bunu atıfta olacak beri callback.

$('form#my-form').one('submit', function myFormSubmitCallback(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    var $this = $(this);
    if (allIsWell) {
        $this.submit(); // submit the form and it will not re-enter the callback because we have worked with .one(...)
    } else {
        $this.one('submit', myFormSubmitCallback); // lets get into the callback 'one' more time...
    }
});

Sen değerini değiştirebilirsiniz allIsWellSnippet'te altında değişken trueveya falseişlevselliğini sınamak için:

$('form#my-form').one('submit', function myFormSubmitCallback(evt){
  evt.stopPropagation();
  evt.preventDefault();
  var $this = $(this);
  var allIsWell = $('#allIsWell').get(0).checked;
  if(allIsWell) {
    $this.submit();
  } else {
    $this.one('submit', myFormSubmitCallback);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/" id="my-form">
  <input name="./fname" value="John" />
  <input name="./lname" value="Smith" />
  <input type="submit" value="Lets Do This!" />
  <br>
  <label>
    <input type="checkbox" value="true" id="allIsWell" />
    All Is Well
  </label>
</form>

İyi şanslar...


2

Tam bir Javascript biçiminde, varsayılanı engelledikten sonra formu gönderebilirsiniz.

Bunun nedeni HTMLFormElement.submit() hiç aramazonSubmit() . Bu nedenle, formu burada özel bir gönderme işleyicisi yokmuş gibi göndermek için bu spesifikasyon tuhaflığına güveniyoruz.

var submitHandler = (event) => {
  event.preventDefault()
  console.log('You should only see this once')
  document.getElementById('formId').submit()
}

Eşzamanlı bir istek için bu kemana bakın .


Eşzamansız bir isteğin tamamlanmasını beklemek de aynı derecede kolaydır:

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

Eşzamansız bir istek örneği için kemanıma bakabilirsiniz .


Ve eğer vaatlerde bulunursan:

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 işte bu istek .


1

e.preventDefault()Mevcut işlemi durduracak olanı kullanabilirsiniz .

yapabileceğinden daha fazla$("#form").submit();

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

bu benim için çok kafa karıştırıcı .. bu sadece etrafta dolanmaz mı?
dapidmini

1

"Döngü göndermeden doğrulama enjeksiyonu":

HTML5 doğrulamasından önce reCaptcha'yı ve diğer bazı şeyleri kontrol etmek istiyorum, bu yüzden böyle bir şey yaptım (doğrulama işlevi doğru veya yanlış döndürür):

$(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();

   });
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.