jQuery AJAX başvuru formu


939

Ben ad orderproductFormve tanımsız sayıda girdi içeren bir form var .

Bir tür jQuery.get veya ajax ya da böyle bir şey Ajax aracılığıyla bir sayfa çağırmak ve formun tüm girdileri birlikte göndermek istiyorum orderproductForm.

Sanırım bir yol böyle bir şey yapmak

jQuery.get("myurl",
          {action : document.orderproductForm.action.value,
           cartproductid : document.orderproductForm.cartproductid.value,
           productid : document.orderproductForm.productid.value,
           ...

Ancak tüm form girdilerini tam olarak bilmiyorum. TÜM form girdilerini gönderecek bir özellik, işlev ya da bir şey var mı?

Yanıtlar:


814

Ajax Form Eklentisi'nden veya jQuery serileştirme işlevinden ajaxForm / ajaxSubmit işlevlerini kullanabilirsiniz .

AjaxForm :

$("#theForm").ajaxForm({url: 'server.php', type: 'post'})

veya

$("#theForm").ajaxSubmit({url: 'server.php', type: 'post'})

ajaxForm, gönder düğmesine basıldığında gönderilir. ajaxSubmit hemen gönderir.

Seri numarası :

$.get('server.php?' + $('#theForm').serialize())

$.post('server.php', $('#theForm').serialize())

AJAX serileştirme belgeleri burada .


2
ilginç bir fikir, ancak, ben aradığım sunucu tarafı kontrol etmiyorum, bu nedenle seri veri gönderemiyorum
Nathan H

25
Evet, adın ne yapacağının önemli olmadığı her form anahtarının ve her form değişkeninin çiftlerini göndermektir.

6
Bir sorgu dizesine serileştirilir, tıpkı GET çağrısında diziye manuel olarak koyduğunuz veriler gibi. İstediğin bu, eminim.
JAL

1
oooh Anlıyorum, daha sonra get çağrısında URL'nin sonuna bu dize ekleyin. PHP serileştirmeyi düşünüyordum. Afedersiniz. Teşekkürler!
Nathan H

238
.ajaxSubmit()/ .ajaxForm()çekirdek jQuery işlevleri değildir
Yarin

1400

Bu basit bir referanstır:

// this is the id of the form
$("#idForm").submit(function(e) {

    e.preventDefault(); // avoid to execute the actual submit of the form.

    var form = $(this);
    var url = form.attr('action');

    $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(), // serializes the form's elements.
           success: function(data)
           {
               alert(data); // show response from the php script.
           }
         });


});

Umarım size yardımcı olur.


46
Ancak form.serialize (), IE'de <input type = "file">
yayınlayamaz

2
Normal form gönderimi için harika bir cevap!
The Sheek Geek

1
@ BjørnBørresen'e benzer şekilde type: $(this).attr('method'), methodözniteliği formunuzda kullanıyorsanız da kullanabilirsiniz .
djule5

2
JQuery 1.8, .success, .error ve .complete'den beri .done, .fail ve .always lehine kullanımdan kaldırıldığını belirtmek gerekir.
Adam

2
@ JohnKary'nin yorumu - harika makale, artık mevcut değil gibi görünüyor. İşte jQuery Events'in bir arşivi : (Yanlış) Return False Kullanımı
KyleMit

455

Form öğesinde tanımlanan öznitelikleri kullanan başka bir benzer çözüm:

<form id="contactForm1" action="/your_url" method="post">
    <!-- Form input fields here (do not forget your name attributes). -->
</form>

<script type="text/javascript">
    var frm = $('#contactForm1');

    frm.submit(function (e) {

        e.preventDefault();

        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                console.log('Submission was successful.');
                console.log(data);
            },
            error: function (data) {
                console.log('An error occurred.');
                console.log(data);
            },
        });
    });
</script>

Name özniteliği "." İçeriyorsa, bunun nasıl yapılacağı hakkında herhangi bir öneri? (Sunucu tarafı gereksinimi, benim fikrim değil).
Josef Engelfrost

Tamamlanması için buna bir hata geri çağrısı ekleyin. Kişi asla ne zaman hata alacağını bilmez, her zaman hesaba katmalıdır.
aaron-kodlama

1
Yöntem veya işlem ayarlamazsanız, bunlar varsayılan olarak getsırasıyla ve geçerli URL'dir. Bu varsayımı koda ekleyerek yapabiliriz.
rybo111

1
JQuery belgeleri ( api.jquery.com/submit ), frm.submit (function (event) {..}); frm.on ("gönder", işlev (olay) {..}); Bana göre, olay tetiklendiğinde yürütülecek bir öğeye bir olay işleyicisi eklediğiniz açıktır.
mehmet

177

Aklınızda bulundurmanız gereken birkaç şey var.

1. Form göndermenin birkaç yolu vardır

  • gönder düğmesini kullanma
  • enter tuşuna basarak
  • JavaScript'te bir gönderme etkinliğini tetikleyerek
  • muhtemelen cihaza veya gelecekteki cihaza bağlı olarak.

Bu nedenle düğme tıklama etkinliğine değil, form gönderme etkinliğine bağlanmalıyız . Bu, kodumuzun şimdi ve gelecekte tüm cihazlarda ve yardımcı teknolojilerde çalışmasını sağlayacaktır.

2. Hijax

Kullanıcının JavaScript'i etkinleştirmemiş olabilir. Bir hijax kalıbı burada iyidir, burada JavaScript kullanarak formun kontrolünü nazikçe kontrol ederiz, ancak JavaScript başarısız olursa gönderilebilir bırakın.

URL ve yöntemi formdan almalıyız, bu nedenle HTML değişirse JavaScript'i güncellememiz gerekmez.

3. Göze batmayan JavaScript

Return false yerine event.preventDefault () yöntemini kullanmak, etkinliğin patlamasına izin verdiği için iyi bir uygulamadır. Bu, diğer komut dosyalarının etkinliğe bağlanmasına olanak tanır; örneğin, kullanıcı etkileşimlerini izliyor olabilecek analitik komut dosyaları.

hız

İdeal olarak komut dosyamızı satır içine eklemek yerine harici bir komut dosyası kullanmalıyız. Buna bir komut dosyası etiketi kullanarak sayfanın baş bölümünde veya hız için sayfanın alt kısmına bağlantı verebiliriz. Komut dosyası, sessizce kullanıcı deneyimini geliştirmeli, engellememelidir.

kod

Yukarıdakilerin tümünü kabul ettiğinizi ve gönderme etkinliğini yakalamak ve AJAX (hijax kalıbı) ile işlemek istediğinizi varsayarsak, şöyle bir şey yapabilirsiniz:

$(function() {
  $('form.my_form').submit(function(event) {
    event.preventDefault(); // Prevent the form from submitting via the browser
    var form = $(this);
    $.ajax({
      type: form.attr('method'),
      url: form.attr('action'),
      data: form.serialize()
    }).done(function(data) {
      // Optionally alert the user of success here...
    }).fail(function(data) {
      // Optionally alert the user of an error here...
    });
  });
});

Bir form gönderimini JavaScript aracılığıyla istediğiniz zaman manuel olarak tetikleyebilirsiniz:

$(function() {
  $('form.my_form').trigger('submit');
});

Düzenle:

Son zamanlarda bunu yapmak zorunda kaldım ve bir eklenti yazdım.

(function($) {
  $.fn.autosubmit = function() {
    this.submit(function(event) {
      event.preventDefault();
      var form = $(this);
      $.ajax({
        type: form.attr('method'),
        url: form.attr('action'),
        data: form.serialize()
      }).done(function(data) {
        // Optionally alert the user of success here...
      }).fail(function(data) {
        // Optionally alert the user of an error here...
      });
    });
    return this;
  }
})(jQuery)

Form etiketinize bir veri otomatik gönderme özelliği ekleyin; ardından bunu yapabilirsiniz:

HTML

<form action="/blah" method="post" data-autosubmit>
  <!-- Form goes here -->
</form>

JS

$(function() {
  $('form[data-autosubmit]').autosubmit();
});

2
'done' ve 'fail' işlevlerine geri aramaları nasıl ekleyebilirim? $ ('form [data-autosubmit]') gibi bir şey. autosubmit (). done (function ({...}); Bu mümkün mü?
Haçlı

1
Merhaba @Crusader - kesinlikle, bu eklentinin bunu döndürmesi yerine, ajax olayını döndürmesini sağlayabilirsiniz, o zaman hemen üzerine zincirleyebilirsiniz. Alternatif olarak eklentinin başarılı bir geri arama almasını sağlayabilirsiniz.
superluminary

Bu ".. JavaScript başarısız olursa gönderilebilir bırakın" nasıl olduğunu burada görmüyorum?
mehmet

@mmatt - JavaScript devre dışı bırakılmışsa, form hala yalnızca bir formdur. Kullanıcı gönder'i tıklar ve düzenli olarak tarayıcı tabanlı bir form gönderilir. Buna ilerici gelişme diyoruz. Modern ekran okuyucular JavaScript'i desteklediğinden günümüzde çok önemli değil.
superluminary

@mmatt - Söz verilen geri çağrılar isteğe bağlı olarak verileri içeren bir parametre alır.
superluminary

41

FormData'yı da kullanabilirsiniz (Ancak IE'de kullanılamaz):

var formData = new FormData(document.getElementsByName('yourForm')[0]);// yourForm: form selector        
$.ajax({
    type: "POST",
    url: "yourURL",// where you wanna post
    data: formData,
    processData: false,
    contentType: false,
    error: function(jqXHR, textStatus, errorMessage) {
        console.log(errorMessage); // Optional
    },
    success: function(data) {console.log(data)} 
});

FormData bu şekilde kullanılır .


8
FormData'nın artık IE10 tarafından desteklendiğini görüyorum. Birkaç yıl içinde bu tercih edilen çözüm olacaktır.
superluminary

3
Bu şekilde ne avantajı var?
nişan

1
@insign avantajı, hiçbir eklenti gerektirmez ve birçok modern tarayıcıda çalışır.
KhoPhi

4
@insign FormData dosyaları da işleyebilir (formunuzda böyle bir alan varsa), serialize () ise yok sayar.
mehmet

Yakalanmayan TypeError: 'FormData' oluşturulamadı: parametre 1 'HTMLFormElement' türünde değil
rahim.nagori

28

Basit sürüm (resim göndermez)

<form action="/my/ajax/url" class="my-form">
...
</form>
<script>
    (function($){
        $("body").on("submit", ".my-form", function(e){
            e.preventDefault();
            var form = $(e.target);
            $.post( form.attr("action"), form.serialize(), function(res){
                console.log(res);
            });
        });
    )(jQuery);
</script>

Bir formun veya tüm formların bir sayfasındaki özetini kopyalayıp yapıştırma

Alfrekjv'in cevabının değiştirilmiş bir versiyonudur.

  • JQuery> = 1.3.2 ile çalışacaktır
  • Belge hazır olmadan önce bunu çalıştırabilirsiniz
  • Formu kaldırabilir ve yeniden ekleyebilirsiniz, yine de çalışır
  • Formun "action" özelliğinde belirtilen normal formla aynı konuma gönderilir

JavaScript

jQuery(document).submit(function(e){
    var form = jQuery(e.target);
    if(form.is("#form-id")){ // check if this is the form that you want (delete this check to apply this to all forms)
        e.preventDefault();
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"), 
            data: form.serialize(), // serializes the form's elements.
            success: function(data) {
                console.log(data); // show response from the php script. (use the developer toolbar console, firefox firebug or chrome inspector console)
            }
        });
    }
});

Alfrekjv'in cevabını düzenlemek istedim ama bundan çok fazla saptı, bu yüzden bunu ayrı bir cevap olarak göndermeye karar verdim.

Dosyaları göndermez, düğmeleri desteklemez, örneğin bir düğmeyi tıklatmak (bir gönderme düğmesi dahil) değerini form verileri olarak gönderir, ancak bu bir ajax isteği olduğundan düğme tıklaması gönderilmez.

Düğmeleri desteklemek için gönder yerine gerçek düğmeyi yakalayabilirsiniz.

jQuery(document).click(function(e){
    var self = jQuery(e.target);
    if(self.is("#form-id input[type=submit], #form-id input[type=button], #form-id button")){
        e.preventDefault();
        var form = self.closest('form'), formdata = form.serialize();
        //add the clicked button to the form data
        if(self.attr('name')){
            formdata += (formdata!=='')? '&':'';
            formdata += self.attr('name') + '=' + ((self.is('button'))? self.html(): self.val());
        }
        jQuery.ajax({
            type: "POST",
            url: form.attr("action"), 
            data: formdata, 
            success: function(data) {
                console.log(data);
            }
        });
    }
});

Sunucu tarafında jquery php için ayarlar bu başlık ile bir ajax isteği tespit edebilirsinizHTTP_X_REQUESTED_WITH

PHP

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    //is ajax
}

Bu forma sahip bir dosya göndermek isterseniz bu nasıl çalışır?
Yami Medina

1
@YamiMedina bu basit bir çözüm değil, tüm talebi dosya verileriyle farklı bir formatta (çok parçalı format) göndermeniz gerekiyor
Timo Huovinen

22

Bu kod dosya girişi ile bile çalışır

$(document).on("submit", "form", function(event)
{
    event.preventDefault();        
    $.ajax({
        url: $(this).attr("action"),
        type: $(this).attr("method"),
        dataType: "JSON",
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data, status)
        {

        },
        error: function (xhr, desc, err)
        {


        }
    });        
});

3
Sadece formData () IE10 + geliştiricisi.mozilla.org/
Chris Hopkins

1
dataType: 'json' form.serialize () kullanmak istiyorsanız önemlidir
David Morrow

vay, bu FormData harika! birinin ihtiyacı varsa: Array.from(new FormData(form))bu formdata yineleyici üzerinden tekrarlar :)
test30

13

Ben gerçekten sevdim bu cevabı ile superluminary bir ve özellikle o sarılmış yoludur çözümü jQuery eklentisi. Bu yüzden çok yararlı bir cevap için süper lümenlere teşekkürler . Benim durumumda olsa da, eklenti başlatıldığında seçenekler aracılığıyla başarı ve hata olay işleyicileri tanımlamak için izin verecek bir eklenti istedim .

İşte benim ortaya koyduğum şey:

;(function(defaults, $, undefined) {
    var getSubmitHandler = function(onsubmit, success, error) {
        return function(event) {
            if (typeof onsubmit === 'function') {
                onsubmit.call(this, event);
            }
            var form = $(this);
            $.ajax({
                type: form.attr('method'),
                url: form.attr('action'),
                data: form.serialize()
            }).done(function() {
                if (typeof success === 'function') {
                    success.apply(this, arguments);
                }
            }).fail(function() {
                if (typeof error === 'function') {
                    error.apply(this, arguments);
                }
            });
            event.preventDefault();
        };
    };
    $.fn.extend({
        // Usage:
        // jQuery(selector).ajaxForm({ 
        //                              onsubmit:function() {},
        //                              success:function() {}, 
        //                              error: function() {} 
        //                           });
        ajaxForm : function(options) {
            options = $.extend({}, defaults, options);
            return $(this).each(function() {
                $(this).submit(getSubmitHandler(options['onsubmit'], options['success'], options['error']));
            });
        }
    });
})({}, jQuery);

Bu eklenti, sayfadaki html formlarını kolayca "ajaxify" ve form gönderme durumunun kullanıcıya geri bildirim uygulamak için onubmit , başarı ve hata olay işleyicileri sağlamamı sağlar . Bu, eklentinin aşağıdaki gibi kullanılmasına izin verdi:

 $('form').ajaxForm({
      onsubmit: function(event) {
          // User submitted the form
      },
      success: function(data, textStatus, jqXHR) {
          // The form was successfully submitted
      },
      error: function(jqXHR, textStatus, errorThrown) {
          // The submit action failed
      }
 });

O Not başarı ve hata olay işleyicileri size karşılık gelen olaylardan alacağı aynı argümanları almak jQuery ajax yöntemiyle.


9

Benim için aşağıdakileri aldım:

formSubmit('#login-form', '/api/user/login', '/members/');

nerede

function formSubmit(form, url, target) {
    $(form).submit(function(event) {
        $.post(url, $(form).serialize())
            .done(function(res) {
                if (res.success) {
                    window.location = target;
                }
                else {
                    alert(res.error);
                }
            })
            .fail(function(res) {
                alert("Server Error: " + res.status + " " + res.statusText);

            })
        event.preventDefault();
    });
}

Bu, 'url' yazısının, ajax değerini {success: false, error:'my Error to display'}

Bunu istediğiniz gibi değiştirebilirsiniz. Bu pasajı kullanmaktan çekinmeyin.


1
targetBurada ne var? Neden sadece yeni bir sayfaya yönlendirmek için AJAX ile bir form gönderesiniz?
1252748

9

jQuery AJAX gönderme formu , bir düğmeyi tıklattığınızda form kimliğini kullanarak bir form göndermekten başka bir şey değildir

Lütfen adımları izleyin

1. Adım - Form etiketi bir kimlik alanına sahip olmalıdır

<form method="post" class="form-horizontal" action="test/user/add" id="submitForm">
.....
</form>

Tıklayacağınız düğme

<button>Save</button>

Adım 2 - Gönderme olayı, form göndermenize yardımcı olan jQuery'de. Aşağıdaki kodda HTML öğesi adından JSON isteği hazırlıyoruz .

$("#submitForm").submit(function(e) {
    e.preventDefault();
    var frm = $("#submitForm");
    var data = {};
    $.each(this, function(i, v){
        var input = $(v);
        data[input.attr("name")] = input.val();
        delete data["undefined"];
    });
    $.ajax({
        contentType:"application/json; charset=utf-8",
        type:frm.attr("method"),
        url:frm.attr("action"),
        dataType:'json',
        data:JSON.stringify(data),
        success:function(data) {
            alert(data.message);
        }
    });
});

canlı demo için aşağıdaki linke tıklayınız

JQuery AJAX kullanarak Form gönderme


5

kullanmayı düşün closest

$('table+table form').closest('tr').filter(':not(:last-child)').submit(function (ev, frm) {
        frm = $(ev.target).closest('form');
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                alert(data);
            }
        })
        ev.preventDefault();
    });

5

Bunun jQueryilgili bir soru olduğunu biliyorum , ama şimdi JS ES6 ile günler çok daha kolay. Saf bir javascriptcevap olmadığından , bence API'yi javascriptkullanarak çok daha temiz olan basit bir saf çözüm ekleyebileceğimi düşündüm fetch(). Bu, ağ isteklerini gerçekleştirmenin modern bir yoludur. Sizin durumunuzda, zaten bir form öğeniz olduğundan, isteğimizi oluşturmak için bunu kullanabiliriz.

const form = document.forms["orderproductForm"];
const formInputs = form.getElementsByTagName("input"); 
let formData = new FormData(); 
for (let input of formInputs) {
    formData.append(input.name, input.value); 
}

fetch(form.action,
    {
        method: form.method,
        body: formData
    })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.log(error.message))
    .finally(() => console.log("Done"));

4

Birden çok form verilerinin gönderilmesini önlemek için:

Formu tekrar göndermeden önce, send olayını engellemeyi unutmayın, Kullanıcı sumbit işlevini birden fazla kez çağırabilir, belki bir şey unutmuş veya bir doğrulama hatasıdır.

 $("#idForm").unbind().submit( function(e) {
  ....

4

Eğer kullanıyorsanız formu ) (.serialize - Böyle her form elemanını bir isim vermek gerekir:

<input id="firstName" name="firstName" ...

Ve form şu şekilde serileştirilir:

firstName=Chris&lastName=Halcrow ...

4

Bunu aşağıdaki gibi gönderme işlevinde kullanabilirsiniz.

HTML Formu

<form class="form" action="" method="post">
    <input type="text" name="name" id="name" >
    <textarea name="text" id="message" placeholder="Write something to us"> </textarea>
    <input type="button" onclick="return formSubmit();" value="Send">
</form>

jQuery işlevi:

<script>
    function formSubmit(){
        var name = document.getElementById("name").value;
        var message = document.getElementById("message").value;
        var dataString = 'name='+ name + '&message=' + message;
        jQuery.ajax({
            url: "submit.php",
            data: dataString,
            type: "POST",
            success: function(data){
                $("#myForm").html(data);
            },
            error: function (){}
        });
    return true;
    }
</script>

Daha fazla ayrıntı ve örnek için şu adresi ziyaret edin: http://www.spiderscode.com/simple-ajax-contact-form/


2

Bu OP'nin sorusunun cevabı değildir,
ancak statik DOM formunu kullanamıyorsanız, bunu da deneyebilirsiniz.

var $form = $('<form/>').append(
    $('<input/>', {name: 'username'}).val('John Doe'),
    $('<input/>', {name: 'user_id'}).val('john.1234')
);

$.ajax({
    url: 'api/user/search',
    type: 'POST',
    contentType: 'application/x-www-form-urlencoded',
    data: $form.serialize(),
    success: function(data, textStatus, jqXHR) {
        console.info(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        var errorMessage = jqXHR.responseText;
        if (errorMessage.length > 0) {
            alert(errorMessage);
        }
    }
});

2

Deneyin

fetch(form.action,{method:'post', body: new FormData(form)});


1

Sadece bir datanesne olabilecek dostça bir hatırlatma :

$('form#foo').submit(function () {
    $.ajax({
        url: 'http://foo.bar/some-ajax-script',
        type: 'POST',
        dataType: 'json',
        data: {
            'foo': 'some-foo',
            'bar': 'some-bar'
        }
    }).always(function (data) {
        console.log(data);
    });

    return false;
});

1

JavaScript

(function ($) {
    var form= $('#add-form'),
      input = $('#exampleFormControlTextarea1');


   form.submit(function(event) {

       event.preventDefault(); 

       var req = $.ajax({
           url: form.attr('action'),
           type: 'POST',
           data: form.serialize()
       });
    req.done(function(data) {
       if (data === 'success') {
           var li = $('<li class="list-group-item">'+ input.val() +'</li>');
            li.hide()
                .appendTo('.list-group')
                .fadeIn();
            $('input[type="text"],textarea').val('');
        }
   });
});


}(jQuery));

HTML

    <ul class="list-group col-sm-6 float-left">
            <?php
            foreach ($data as $item) {
                echo '<li class="list-group-item">'.$item.'</li>';
            }
            ?>
        </ul>

        <form id="add-form" class="col-sm-6 float-right" action="_inc/add-new.php" method="post">
            <p class="form-group">
                <textarea class="form-control" name="message" id="exampleFormControlTextarea1" rows="3" placeholder="Is there something new?"></textarea>
            </p>
            <button type="submit" class="btn btn-danger">Add new item</button>
        </form>

-21

Bu $ ("# form_id") gibi tetiklenebilen bir gönderme etkinliği de var. Form zaten HTML'de iyi temsil ediliyorsa bu yöntemi kullanırsınız. Sayfayı okudunuz, form girişlerini bir şeylerle doldurup .submit () öğesini çağırdınız. Formun bildiriminde tanımlanan yöntemi ve eylemi kullanır, bu nedenle javascript'inize kopyalamanız gerekmez.

örnekler


58
yayınınızı silerseniz, sizden geri alınan ceza puanlarını alırsınız.
sparkyspider

2
Bu formu gönderir, ancak AJAX aracılığıyla göndermez, bu yüzden soruyu cevaplamaz.
superluminary

11
@spider ne dedi, artı "akran baskısı" adlı güzel bir rozet olsun
nurettin
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.