Formun gönderilmesi nasıl önlenir?


243

Bir yerde bir Gönder düğmesi olan bir form var.

Ancak, bir şekilde gönder olayı 'yakalamak' ve gerçekleşmesini önlemek istiyorum.

Bunu yapmamın bir yolu var mı?

Gönder düğmesini değiştiremiyorum, çünkü bu özel bir kontrolün parçası.


Gönder düğmesine yine de erişebilirsiniz. Sayfayı işleyin ve sayfa kaynağını görüntüleyerek ClientID'sini alın. Ardından, jQuery gibi bir şey kullanarak $ ('# ctl01_cph01_controlBtn1') gibi bir şey yapabilirsiniz. Click (function () {return false;});
rebelliard

@Rafael: Doğru ... ama bu son çare olurdu - bu çok karmaşık bir kontrol.
Nathan Osman

@ Asp.net tabanlı ve aynı zamanda en iyi uygulama değil. Ama aslında doğru. Birisi sayfayı düzenlerse değişebileceğinden, kaynağa bakmaktan ve kontrol adını kullanmaktan kaçınırım. İstenmeyen yan etkiler vb.

Yanıtlar:


260

Diğer cevaplardan farklı olarak, dönüş yanıtın falsesadece bir parçasıdır . Dönüş ifadesinden önce bir JS hatasının oluştuğu senaryoyu düşünün ...

html

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

senaryo

function mySubmitFunction()
{
  someBug()
  return false;
}

dönen falseburada yürütülmez ve form her iki şekilde sunulacaktır. Ayrıca preventDefault, Ajax form gönderimleri için varsayılan form eylemini önlemek için de çağırmalısınız .

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

Bu durumda, hata ile bile form gönderilmez!

Alternatif olarak, bir try...catchblok kullanılabilir.

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}

4
Neden falsedoğrudan geri dönmeyesiniz onsumbit?
ProfK

1
Gönderim sırasında kullanıcıya bir hata mesajı göstermek isteyebilirsiniz. Örneğin, "bu zorunlu alanı doldurun ve gönderin". Bu durumda event.preventDefault çok kullanışlı olacak
Mark Chorley

1
@ProfK olay.preventDefault () kullanırsanız, farketmez, deneyin / yakala sadece hata işlemenizin bir parçası olacaktır
Ben Rowe

11
<form onsubmit = "return mySubmitFunction (event)"> çalıştı ... firefox'ta parantez içinde kelime olayını kullanmak zorundaydı
danday74

5
@BenRowe Çağrılan yönteme evt parametresini eklemelisiniz. (<form onsubmit="return mySubmitFunction(evt)">)Aksi takdirde Tanımsız hata verir.
UfukSURMEN

143

Bu onsubmitgibi satır içi etkinliği kullanabilirsiniz

<form onsubmit="alert('stop submit'); return false;" >

Veya

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

gösteri

Büyük projeler yaparken bu iyi bir fikir olmayabilir. Etkinlik Dinleyicilerini kullanmanız gerekebilir.

Lütfen hakkında daha fazla bilgi Etkinlik İşleyicilere (addEventListener ve IE'nin attachEvent) vs Inline Olaylar burada . Çünkü bunu Chris Baker'ın yaptığından daha fazla açıklayamam .

Her ikisi de doğrudur, ancak hiçbiri kendi başına "en iyi" değildir ve geliştiricinin her iki yaklaşımı kullanmayı seçmesinin bir nedeni olabilir.


Yolda güzel, hızlı bir çözüm.
Fernando Torres

nedense <form onsubmit="return false;" >benim için çalışmıyor.
Ruan

102

Aşağıdaki öğeyi kullanarak forma bir olay dinleyicisi ekleyin .addEventListener()ve ardından şu .preventDefault()yöntemi çağırın event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

Web sayfası mantığını ve yapısını ayırdığı submitiçin bir olay işleyicisi ile onsubmitöznitelik satır içi tanımlamaktan daha iyi bir çözüm olduğunu düşünüyorum . Mantığın HTML'den ayrıldığı bir projeyi sürdürmek çok daha kolaydır. Bkz: Göze batmayan JavaScript .

DOM nesnesinin .onsubmitözelliğini kullanmak formiyi bir fikir değildir, çünkü bir öğeye birden çok geri gönderme isteği eklemenizi önler. Bkz. AddEventListener vs onclick .


1
& jquery için: $("button").click(function(e) { e.preventDefault() });
Nixen85

2
+1, diğer tüm cevapların neden satır içi onubmits kullanmaya devam ettiğini bilmez, çünkü OP düğmeyi değiştiremeyeceğini belirtti (bu da muhtemelen formu değiştiremeyeceği anlamına gelir). Düğme
Robert Sinclair

16

Bunu dene...

HTML Kodu

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

jQuery Kodu

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

veya

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});

18
Bu soruda jQuery etiketi yok.
Michał Perłakowski

6
@Gothdo ve çözüm hala aynı. deli değil mi?
Kevin B

7
@Gothdo yea, tamamen aynı. eventObject.preventDefault. İşleyiciyi bağlama şekliniz çözümü değiştirmez. Cevabınızın kabul edilenden farklı olmadığını bile iddia ediyorum.
Kevin B

stopPropagationbenim durumumda işe yarayan tek şeydi. Teşekkürler! :)
cregox

13

Şu andan itibaren aşağıdakiler çalışır (krom ve firefox'ta test edilmiştir):

<form onsubmit="event.preventDefault(); return validateMyForm();">

Burada validateMyForm (), falsedoğrulama başarısız olursa geri dönen bir işlevdir . Önemli nokta ismi kullanmaktır event. Örneğin,e.preventDefault()


1
onsubmit = "return validateMyForm ();" yeterli, ancak validateMyForm () doğru veya yanlış döndürmelidir.
Adrian P.

8
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}

2
Kullanmanın .onsubmitkötü bir fikir olduğunu düşünüyorum çünkü submitbir öğeye birden fazla geri arama eklemenizi engelliyor . Kullanmanızı tavsiye ederim .addEventListener().
Michał Perłakowski

3
.Onsubmit özelliği aracılığıyla bir olay işleyici ayarlamış olsanız bile, yine de .addEventListener () üzerinden ek işleyiciler ekleyebilirsiniz. Mülk tarafından kaydedilen işleyici önce .addEventListener () öğesine kaydedilmiş olanları kaydedildikleri sırayla çağırır.
Daniel Granger

2

İzleyin göze batmayan JavaScript programlama kuralları ve ne kadar hızlı bağlı olarak DOM yükleyecektir, aşağıdaki kullanmak iyi bir fikir olabilir:

<form onsubmit="return false;"></form>

Ardından kütüphane kullanıyorsanız, onload veya DOM için hazır olan olayları kullanarak olayları bağlayın.

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

Ayrıca, actionbazı kişilerin NoScript gibi bazı eklentileri çalıştırabileceği için bu özelliği her zaman kullanırım . Action özniteliğini kullanıyorsanız, en azından kullanıcınız sunucu tarafından arka uç doğrulamasına göre yönlendirilecektir. window.locationÖte yandan, böyle bir şey kullanıyorsanız , işler kötü olacaktır.


2

Formun gönderilmesini önlemek için bunu yapmanız yeterlidir.

<form onsubmit="event.preventDefault()">
    .....
</form>

Yukarıdaki kodu kullanarak bu form gönderilmesini engelleyecektir.


0

İşte cevabım:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

Ekledim event.preventDefault(); üstünde onsubmitve çalışıyor.


0

Forma eventListner ekleyebilir preventDefault()ve form verilerini aşağıdaki gibi JSON'a dönüştürebilirsiniz:

const formToJSON = elements => [].reduce.call(elements, (data, element) => {
  data[element.name] = element.value;
  return data;

}, {});

const handleFormSubmit = event => {
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => {
      const rawResponse = await fetch('/', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jdata
      });
      const content = await rawResponse.json();

      console.log(content);
    })();
};

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

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.