JavaScript'te bir form gönderimine müdahale edin ve normal gönderimi önleyin


84

JavaScript kullanarak bir formun nasıl gönderileceğine dair çok fazla bilgi var gibi görünüyor, ancak bir form gönderildiğinde yakalamak ve javascript'e müdahale etmek için bir çözüm arıyorum.

HTML

<form>
 <input type="text" name="in" value="some data" />
 <button type="submit">Go</button>
</form>

Bir kullanıcı gönder düğmesine bastığında, formun gönderilmesini istemiyorum, bunun yerine bir JavaScript işlevinin çağrılmasını istiyorum.

function captureForm() {
 // do some stuff with the values in the form
 // stop form from being submitted
}

Hızlı bir hack, düğmeye bir onclick işlevi eklemek olabilir, ancak bu çözümü sevmiyorum ... bir form göndermenin birçok yolu var ... örneğin, bir giriş üzerindeyken return tuşuna basmak, ki bunu hesaba katmaz.

Ty


Yanıtlar:


96
<form id="my-form">
    <input type="text" name="in" value="some data" />
    <button type="submit">Go</button>
</form>

JS'de:

function processForm(e) {
    if (e.preventDefault) e.preventDefault();

    /* do what you want with the form */

    // You must return false to prevent the default form behavior
    return false;
}

var form = document.getElementById('my-form');
if (form.attachEvent) {
    form.attachEvent("submit", processForm);
} else {
    form.addEventListener("submit", processForm);
}

Düzenleme : Bence bu yaklaşım, onSubmitbiçimlendirme ve işlevsellik ayrımını koruduğu için özelliği formda ayarlamaktan daha iyidir . Ama bu sadece iki sentim.

Edit2 : Örneğim güncellendipreventDefault()


bu da bildiğim kadarıyla kullanıyorum gördüğünüz gibi krom değil çalışır jsbin.com/ejoyas
Eiyrioü von Kauyf

2
Ekleme olay kodunun, form etki alanında mevcut olduktan SONRA yürütülmesi gerektiğini unutmayın. Örneğin window.onload=function() { ... }, sarmak için kullanmak
mplungjan

processform()işlev ne zaman çağrılır efendim?

IE kullanmadığım için emin değilim, ancak attachEvent parametresinin "onsubmit" olması gerektiğini düşünüyorum.
Gerard ONeill

Bu krom 46 çalışmaz, bir olayı takılarak hata, gerek birinci sayfası yüklemeye
Tsukimi

29

Eklediğiniz öğeler yüklenmeden olay ekleyemezsiniz

Bu çalışıyor -

Düz JS

DEMO

EventListener kullanılması önerilir

// Should only be triggered on first page load
console.log('ho');

window.addEventListener("load", function() {
  document.getElementById('my-form').addEventListener("submit", function(e) {
    e.preventDefault(); // before the code
    /* do what you want with the form */

    // Should be triggered on form submit
    console.log('hi');
  })
});
<form id="my-form">
  <input type="text" name="in" value="some data" />
  <button type="submit">Go</button>
</form>

ancak birden fazla dinleyiciye ihtiyacınız yoksa onload ve onsubmit kullanabilirsiniz

// Should only be triggered on first page load
console.log('ho');

window.onload = function() {
  document.getElementById('my-form').onsubmit = function() {
    /* do what you want with the form */

    // Should be triggered on form submit
    console.log('hi');
    // You must return false to prevent the default form behavior
    return false;
  }
}
    <form id="my-form">
      <input type="text" name="in" value="some data" />
      <button type="submit">Go</button>
    </form>

jQuery

// Should only be triggered on first page load
console.log('ho');

$(function() {
  $('#my-form').on("submit", function(e) {
    e.preventDefault(); // cancel the actual submit

    /* do what you want with the form */

    // Should be triggered on form submit

    console.log('hi');
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="my-form">
  <input type="text" name="in" value="some data" />
  <button type="submit">Go</button>
</form>


Sanırım şunu demek istediniz: $ ('# formum) .on (' gönder ', fonksiyon () {alert (' hi ');});
Michiel

1
@Michiel, sağladığınız şey jQuery ile kullandığınız şey olsa da, sağlanan bu çözüm, jQuery'ye bağımlı olmayan saf bir JS çözümüdür. Buradaki çözüm, kullanmaya benzer<form onsubmit="alert('hi'); return false;">
Chris Marisic

2
@ChrisMarisic - birkaç yaşında :) Cevabı yine de
jQuery'yi

17

<form onSubmit="return captureForm()"> yapmalı. captureForm()Yönteminizin geri döndüğünden emin olun false.


Takip: Tarayıcının gerekli özniteliği işlemesini etkilemeden JavaScript ile bir form gönderimi yakalamanın bir yolu var mı?
Elisabeth

@Elisabeth Hangi niteliğin ne işlenmesi? Formun gerçekten gönderilmesini engellemek istemiyorsanız, bunun yerine captureForm()geri dönmeniz gerekir . truefalse
kba

Tarayıcının "gerekli" özniteliği işlemesi. Formun gönderilmesini engellemek istiyorum. Ancak true yerine false döndürerek (veya preventDefault () kullanarak), tarayıcının bir giriş öğesinde "gerekli" özniteliği işleme şeklini değiştirir. Kendiniz deneyin: bir giriş öğesine <code> gerekli </code> ekleyin, gönderimi yakalayın ve bunun için varsayılan davranışı kaybedip kaybetmediğinizi görün.
Elisabeth

Varsayılan davranışı kaybetmiş görünmüyorum. Chrome'da iyi çalışıyor. Yardım edebilmem için hatalı bir örnek bulman gerekecek.
kba

1
Tamam, işte form: <form method = "get" action = ""> <label for = "color"> En sevdiğiniz renk nedir? </label> <input type = "text" name = "color" placeholder = "blue" gerekli> <input id = "submit" type = "submit" value = "Gönder"> </form> ve işte kod: function processForm (e) {var form = document.querySelector ("form"); for (var i = 0; i <form.childNodes.length; i ++) {var node = form.childNodes [i]; / * düğümlerle şeyler yap /} / dönüş yanlış; * /} Operada test ediliyor. Son satırın açıklamasını kaldırın, gerekli başarısız olur. (Üzgünüz kodu yorumlarda pek işe yaramıyor)
Elisabeth

6

Onload'un yardımcı olamadığı durumlar için uygulamamda kullandığım tüm istekleri işlemek için bir başka seçenek de javascript submit, html submit, ajax isteklerini ele almaktır. Bu kod, herhangi bir form oluşturulmadan ve gönderilmeden önce dinleyici oluşturmak için gövde öğesinin üst kısmına eklenmelidir.

Örneğin, sayfa yüklenmeden önce olsa bile, gizli alanı gönderirken sayfadaki herhangi bir forma ayarlıyorum.

//Handles jquery, dojo, etc. ajax requests
(function (send) {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    XMLHttpRequest.prototype.send = function (data) {
        if (isNotEmptyString(token) && isNotEmptyString(header)) {
            this.setRequestHeader(header, token);
        }
        send.call(this, data);
    };
})(XMLHttpRequest.prototype.send);


//Handles javascript submit
(function (submit) {
    HTMLFormElement.prototype.submit = function (data) {
        var token = $("meta[name='_csrf']").attr("content");
        var paramName = $("meta[name='_csrf_parameterName']").attr("content");
        $('<input>').attr({
            type: 'hidden',
            name: paramName,
            value: token
        }).appendTo(this);

        submit.call(this, data);
    };
})(HTMLFormElement.prototype.submit);


//Handles html submit
document.body.addEventListener('submit', function (event) {
    var token = $("meta[name='_csrf']").attr("content");
    var paramName = $("meta[name='_csrf_parameterName']").attr("content");
    $('<input>').attr({
        type: 'hidden',
        name: paramName,
        value: token
    }).appendTo(event.target);
}, false);

2

@Kristian Antonsen'in cevabını kullanın veya şunu kullanabilirsiniz:

$('button').click(function() {
    preventDefault();
    captureForm();
});

4
bunu 2,5 yıl (veya daha uzun) sonra yapan herhangi biri için, click olayını parametre olarak işleve function(e)e.preventDefault()
geçirmeniz

Girişiniz [type = "submit"] kullanılıyorsa ve bu sizi düğme bağlamına karşı form bağlamına yerleştirirse, form için "gönder" olayında da yakalanabilir. Geri arama her zaman olayın bağlamına sahip olacaktır, bu nedenle bir argüman olarak 'e' geçmeniz gerekmez, sadece 'olayı' kastediyorsunuz.
augurone

1
Gönderim bir tuşa basılmasıyla tetiklenebileceğinden bu önerilmez.
jhpratt
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.