jQuery AJAX ส่งแบบฟอร์ม


939

ฉันมีแบบฟอร์มที่มีชื่อorderproductFormและจำนวนอินพุตที่ไม่ได้กำหนด

ผมต้องการที่จะทำชนิดของ jQuery.get orderproductFormหรืออาแจ็กซ์หรืออะไรอย่างนั้นบางอย่างที่จะเรียกผ่านหน้าอาแจ็กซ์และส่งพร้อมทุกปัจจัยการผลิตของแบบฟอร์ม

ฉันคิดว่าวิธีหนึ่งที่จะทำสิ่งที่ชอบ

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

อย่างไรก็ตามฉันไม่ทราบว่าป้อนแบบฟอร์มทั้งหมดอย่างแน่นอน มีคุณสมบัติฟังก์ชั่นหรือบางสิ่งบางอย่างที่เพิ่งจะส่งรูปแบบการป้อนข้อมูลทั้งหมดหรือไม่

คำตอบ:


814

คุณสามารถใช้ฟังก์ชั่น ajaxForm / ajaxSubmit จากAjax Form Pluginหรือฟังก์ชั่นการทำให้เป็นอนุกรม jQuery

AjaxForm :

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

หรือ

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

ajaxForm จะส่งเมื่อกดปุ่มส่ง ajaxSubmit ส่งทันที

ทำให้เป็นอันดับ :

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

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

เอกสารเป็นอันดับ AJAX อยู่ที่นี่


2
แนวคิดที่น่าสนใจ แต่ผมไม่ได้ควบคุมฝั่งเซิร์ฟเวอร์ฉันโทรดังนั้นฉันไม่สามารถส่งมันต่อเนื่องข้อมูล
นาธาน H

25
ใช่คุณชื่อไม่สำคัญว่าจะทำอะไรก็คือส่งคู่ของทุกคีย์ - ฟอร์มและทุกฟอร์ม - ตัวแปร

6
มันเป็นอนุกรมในสตริงแบบสอบถามเช่นเดียวกับข้อมูลที่คุณใส่ลงในอาร์เรย์ด้วยตนเองในการเรียก GET จะมี นี่คือสิ่งที่คุณต้องการฉันค่อนข้างแน่ใจ
JAL

1
oooh ฉันเห็นแล้วฉันเพิ่มสายนี้ในตอนท้ายของ URL ในการรับสาย ฉันคิดว่า PHP เป็นอันดับ ขอโทษ ขอบคุณ!
นาธาน H

238
.ajaxSubmit()/ .ajaxForm()ไม่ใช่ฟังก์ชัน jQuery หลัก - คุณต้องใช้ปลั๊กอินแบบฟอร์ม jQuery
Yarin

1400

นี่เป็นข้อมูลอ้างอิงอย่างง่าย:

// 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.
           }
         });


});

ฉันหวังว่ามันจะช่วยคุณ


46
แต่ form.serialize () ไม่สามารถโพสต์ <input type = "file"> ใน IE
macio.Jun

2
คำตอบที่ดีสำหรับการส่งแบบฟอร์มปกติ!
The Sheek Geek

1
คล้ายกับ @ BjørnBørresenคุณสามารถใช้type: $(this).attr('method')หากคุณใช้แอmethodททริบิวในแบบฟอร์มของคุณ
djule5

2
อาจมีมูลค่าการกล่าวขวัญว่าตั้งแต่ jQuery 1.8, .success, .error และ .complete ถูกคัดค้านด้วย. done, .fail และ. always
อดัม

2
@ ความคิดเห็นของ JohnKary - บทความที่ดีดูเหมือนว่าจะไม่มีให้บริการอีกต่อไป นี่คือที่เก็บถาวรของเหตุการณ์ jQuery: หยุด (Mis) โดยใช้ Return False
KyleMit

455

โซลูชันอื่นที่คล้ายคลึงกันโดยใช้แอตทริบิวต์ที่กำหนดไว้ในองค์ประกอบของฟอร์ม:

<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>

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการทำเช่นนี้หากคุณลักษณะชื่อรวมถึง "."? (ข้อกำหนดฝั่งเซิร์ฟเวอร์ไม่ใช่ความคิดของฉัน)
Josef Engelfrost

รวมข้อผิดพลาดในการติดต่อกลับเพื่อให้เสร็จสมบูรณ์ ไม่มีใครรู้ว่าเมื่อไหร่ที่จะได้รับข้อผิดพลาดควรคำนึงถึงมันเสมอ
รอนเขียนโปรแกรม

1
หากคุณไม่ได้ตั้งค่าวิธีการหรือการดำเนินการพวกเขาเริ่มต้นgetและ URL ปัจจุบันตามลำดับ สามารถทำได้ด้วยการเพิ่มสมมติฐานนี้ไปยังรหัส
rybo111

1
สำหรับเอกสาร jQuery ( api.jquery.com/submit ), frm.submit (ฟังก์ชั่น (เหตุการณ์) {.. }); เทียบเท่ากับ frm.on ("ส่ง", ฟังก์ชั่น (เหตุการณ์) {.. }); สำหรับฉันแล้วสามารถอ่านได้มากขึ้นเนื่องจากเห็นได้ชัดว่าคุณกำลังแนบตัวจัดการเหตุการณ์กับองค์ประกอบที่จะดำเนินการเมื่อมีเหตุการณ์ถูกไล่ออก
เมห์เม็ต

177

มีบางสิ่งที่คุณต้องจำไว้

1. มีหลายวิธีในการส่งแบบฟอร์ม

  • ใช้ปุ่มส่ง
  • โดยกด Enter
  • โดยเรียกกิจกรรมส่งใน JavaScript
  • อาจมากขึ้นขึ้นอยู่กับอุปกรณ์หรืออุปกรณ์ในอนาคต

ดังนั้นเราควรผูกไว้กับเหตุการณ์ส่งแบบฟอร์มไม่ใช่เหตุการณ์คลิกปุ่ม สิ่งนี้จะทำให้มั่นใจได้ว่าโค้ดของเราทำงานบนอุปกรณ์และเทคโนโลยีการช่วยเหลือทั้งหมดในปัจจุบันและในอนาคต

2. Hijax

ผู้ใช้อาจไม่ได้เปิดใช้งาน JavaScript hijaxรูปแบบเป็นสิ่งที่ดีที่นี่ที่เราเบา ๆ ใช้การควบคุมของรูปแบบการใช้ JavaScript แต่ปล่อยให้มัน submittable ถ้า JavaScript ล้มเหลว

เราควรดึง URL และวิธีการจากแบบฟอร์มดังนั้นหาก HTML เปลี่ยนแปลงเราไม่จำเป็นต้องอัปเดต JavaScript

3. JavaScript ที่ไม่เป็นการรบกวน

การใช้event.preventDefault ()แทนที่จะส่งคืน falseเป็นแนวปฏิบัติที่ดีเนื่องจากช่วยให้เหตุการณ์เพิ่มขึ้น ซึ่งช่วยให้สคริปต์อื่น ๆ ผูกเข้ากับเหตุการณ์ตัวอย่างเช่นสคริปต์การวิเคราะห์ที่อาจตรวจสอบการโต้ตอบของผู้ใช้

ความเร็ว

เราควรใช้สคริปต์ภายนอกแทนการแทรกอินไลน์สคริปต์ของเรา เราสามารถเชื่อมโยงไปยังส่วนนี้ในส่วนหัวของหน้าโดยใช้แท็กสคริปต์หรือเชื่อมโยงไปที่ด้านล่างของหน้าเพื่อความเร็ว สคริปต์ควรปรับปรุงประสบการณ์ผู้ใช้อย่างเงียบ ๆ ไม่ให้เข้าทาง

รหัส

สมมติว่าคุณเห็นด้วยกับทุกอย่างที่กล่าวมาข้างต้นและคุณต้องการติดตามเหตุการณ์ส่งและจัดการผ่าน AJAX (รูปแบบ hijax) คุณสามารถทำสิ่งนี้:

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

คุณสามารถเปิดใช้งานการส่งแบบฟอร์มทุกครั้งที่คุณต้องการผ่าน JavaScript โดยใช้สิ่งที่ชอบ:

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

แก้ไข:

ฉันเพิ่งจะทำสิ่งนี้และจบลงด้วยการเขียนปลั๊กอิน

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

เพิ่ม data-autosubmit attribute ให้กับ form form ของคุณจากนั้นคุณสามารถทำได้:

HTML

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

JS

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

2
ฉันจะเพิ่มการเรียกกลับไปยังฟังก์ชัน 'เสร็จสิ้น' และ 'ล้มเหลว' ได้อย่างไร บางอย่างเช่น $ ('form [data-autosubmit]'). autosubmit (). เสร็จแล้ว (ฟังก์ชั่น ({... }); สิ่งนี้เป็นไปได้หรือไม่
Crusader

1
สวัสดี @Crusader - แน่นอนว่าแทนที่จะให้ปลั๊กอินคืนค่านี้คุณสามารถให้มันคืนค่าเหตุการณ์ ajax จากนั้นคุณสามารถเชื่อมโยงเข้ากับมันได้ หรือคุณอาจให้ปลั๊กอินได้รับการติดต่อกลับสำเร็จ
superluminary

ฉันไม่เห็นว่า ".. ปล่อยให้มันส่งได้อย่างไรหาก JavaScript ล้มเหลว" เกิดขึ้นที่นี่
เมห์เม็ต

@mmatt - หากปิดใช้งาน JavaScript ฟอร์มจะยังคงเป็นเพียงแบบฟอร์ม ผู้ใช้คลิกส่งและเกิดการส่งแบบฟอร์มตามเบราว์เซอร์ปกติ เราเรียกการเพิ่มประสิทธิภาพแบบก้าวหน้านี้ ทุกวันนี้มันไม่ใช่เรื่องใหญ่นักเนื่องจากโปรแกรมอ่านหน้าจอที่ทันสมัยรองรับ JavaScript
superluminary

@mmatt - การโทรกลับสัญญาจะเลือกรับพารามิเตอร์ที่มีข้อมูล
superluminary

41

คุณยังสามารถใช้FormData (แต่ไม่มีใน IE):

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


8
ฉันเห็น FormData รองรับ IE10 แล้ว ในไม่กี่ปีนี้จะเป็นทางออกที่ต้องการ
superluminary

3
ข้อดีของวิธีนี้คืออะไร?
insign

1
@insign advantage คือไม่ต้องใช้ปลั๊กอินใด ๆ และทำงานบนเบราว์เซอร์ที่ทันสมัยจำนวนมาก
KhopPhi

4
@insign FormData สามารถจัดการไฟล์ได้เช่นกัน (ถ้ามีฟิลด์หนึ่งฟิลด์ในฟอร์มของคุณ) ในขณะที่ซีเรียลไลซ์ () เพียงแค่ข้ามมันไป
เมห์เม็ต

Uncaught TypeError: ล้มเหลวในการสร้าง 'FormData': พารามิเตอร์ 1 ไม่ใช่ประเภท 'HTMLFormElement'
rahim.nagori

28

เวอร์ชั่นธรรมดา (ไม่ส่งภาพ)

<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>

คัดลอกและวาง ajaxification ของแบบฟอร์มหรือแบบฟอร์มทั้งหมดบนหน้า

มันเป็นคำตอบของ Alfrekjv ที่ได้รับการแก้ไข

  • มันจะทำงานกับ jQuery> = 1.3.2
  • คุณสามารถเรียกใช้สิ่งนี้ก่อนที่เอกสารจะพร้อม
  • คุณสามารถลบและเพิ่มฟอร์มใหม่และมันจะยังคงทำงาน
  • มันจะโพสต์ไปยังตำแหน่งเดียวกันกับแบบฟอร์มปกติที่ระบุในแอตทริบิวต์ "action" ของแบบฟอร์ม

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 แต่เบี่ยงเบนไปจากนั้นจึงตัดสินใจที่จะโพสต์สิ่งนี้เป็นคำตอบแยกต่างหาก

ไม่ส่งไฟล์ไม่สนับสนุนปุ่มตัวอย่างเช่นการคลิกปุ่ม (รวมถึงปุ่มส่ง) ส่งค่าเป็นข้อมูลฟอร์ม แต่เนื่องจากเป็นการร้องขอ ajax การคลิกปุ่มจะไม่ถูกส่ง

เพื่อสนับสนุนปุ่มคุณสามารถจับภาพปุ่มที่แท้จริงคลิกแทนการส่ง

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);
            }
        });
    }
});

ในฝั่งเซิร์ฟเวอร์คุณสามารถตรวจสอบคำขอ ajaxด้วยส่วนหัวนี้ที่ jquery ตั้งค่าHTTP_X_REQUESTED_WITH ไว้สำหรับ php

PHP

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

มันจะทำงานอย่างไรถ้าคุณต้องการส่งไฟล์ด้วยแบบฟอร์มนี้?
Yami Medina

1
@YamiMedina ที่ไม่ได้เป็นทางออกที่ง่ายคุณจะต้องส่งคำขอทั้งในรูปแบบที่แตกต่างกัน (รูปแบบหลายส่วน) กับข้อมูลไฟล์
Timo Huovinen

22

รหัสนี้ทำงานได้แม้กับไฟล์ที่ป้อน

$(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
เพียงแค่ต้องทราบ formData () คือ IE10 + developer.mozilla.org/en-US/docs/Web/API/FormData
Chris Hopkins

1
DataType: 'json' มีความสำคัญหากคุณต้องการใช้ form.serialize ()
David Morrow

ว้าว FormData นี้วิเศษมาก! ในกรณีที่มีคนต้องการ: Array.from(new FormData(form))iterates มากกว่านี้ iterator formdata :)
test30

13

ฉันชอบคำตอบนี้โดยsuperluminaryและโดยเฉพาะอย่างยิ่งวิธีที่เขาห่อคือโซลูชันในปลั๊กอินjQuery ดังนั้นขอบคุณsuperluminaryสำหรับคำตอบที่มีประโยชน์มาก ในกรณีของฉันฉันต้องการปลั๊กอินที่จะอนุญาตให้ฉันกำหนดตัวจัดการเหตุการณ์ความสำเร็จและข้อผิดพลาดโดยใช้ตัวเลือกเมื่อเริ่มต้นปลั๊กอิน

ดังนั้นนี่คือสิ่งที่ฉันมาด้วย:

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

ปลั๊กอินนี้จะช่วยให้ผมได้อย่างง่ายดายมาก "ajaxify" รูปแบบ HTML ในหน้าและให้onsubmit , ความสำเร็จและข้อผิดพลาดเหตุการณ์ขนย้ายวัสดุสำหรับการดำเนินการข้อเสนอแนะให้กับผู้ใช้สถานะของแบบฟอร์มส่ง อนุญาตให้ใช้ปลั๊กอินนี้ได้ดังนี้:

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

โปรดทราบว่าตัวจัดการเหตุการณ์ความสำเร็จและข้อผิดพลาดได้รับอาร์กิวเมนต์เดียวกับที่คุณจะได้รับจากเหตุการณ์ที่เกี่ยวข้องของเมธอด jQuery ajax


9

ฉันได้รับต่อไปนี้สำหรับฉัน:

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

ที่ไหน

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

นี่ถือว่าโพสต์เป็น 'url' ส่งคืนอาแจ็กซ์ในรูปแบบของ {success: false, error:'my Error to display'}

คุณสามารถเปลี่ยนแปลงสิ่งนี้ตามที่คุณต้องการ รู้สึกอิสระที่จะใช้ตัวอย่าง


1
อะไรtargetที่นี่? ทำไมคุณถึงส่งแบบฟอร์มด้วย AJAX เพื่อเปลี่ยนเส้นทางไปยังหน้าใหม่เท่านั้น
1252748

9

jQuery AJAX ส่งแบบฟอร์มไม่มีอะไรนอกจากส่งแบบฟอร์มโดยใช้รหัสแบบฟอร์มเมื่อคุณคลิกที่ปุ่ม

กรุณาทำตามขั้นตอน

ขั้นตอนที่ 1 - แท็กแบบฟอร์มต้องมีฟิลด์ ID

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

ปุ่มที่คุณจะคลิก

<button>Save</button>

ขั้นตอนที่ 2 - ส่งเหตุการณ์อยู่ใน jQuery ซึ่งช่วยในการส่งแบบฟอร์ม ด้านล่างรหัสเรากำลังเตรียมคำขอ JSON จากองค์ประกอบ HTML ชื่อ

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

สำหรับการสาธิตสดคลิกที่ลิงค์ด้านล่าง

วิธีการส่งแบบฟอร์มโดยใช้ jQuery AJAX


5

พิจารณาใช้ 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

ฉันรู้ว่านี่เป็นjQueryคำถามที่เกี่ยวข้อง แต่ตอนนี้สิ่งต่างๆกับ JS ES6 นั้นง่ายกว่ามาก เนื่องจากไม่มีjavascriptคำตอบที่แท้จริงฉันคิดว่าฉันสามารถเพิ่มjavascriptโซลูชันบริสุทธิ์แบบง่าย ๆให้กับสิ่งนี้ซึ่งในความคิดของฉันนั้นสะอาดกว่ามากโดยใช้fetch()API วิธีนี้เป็นวิธีที่ทันสมัยในการดำเนินการตามคำขอเครือข่าย ในกรณีของคุณเนื่องจากคุณมีองค์ประกอบแบบฟอร์มอยู่แล้วเราก็สามารถใช้มันเพื่อสร้างคำขอของเรา

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

หากต้องการหลีกเลี่ยงการส่ง formdata หลายรายการ:

อย่าลืมยกเลิกการผูกกิจกรรมก่อนที่แบบฟอร์มจะส่งอีกครั้งผู้ใช้สามารถเรียกใช้ฟังก์ชั่น sumbit ได้มากกว่าหนึ่งครั้งบางทีเขาอาจจะลืมบางสิ่งบางอย่างหรือเป็นข้อผิดพลาดในการตรวจสอบความถูกต้อง

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

4

หากคุณใช้form .serialize () - คุณต้องตั้งชื่อองค์ประกอบให้กับแต่ละองค์ประกอบดังนี้:

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

และแบบฟอร์มจะได้รับต่อเนื่องเช่นนี้:

firstName=Chris&lastName=Halcrow ...

4

คุณสามารถใช้สิ่งนี้ในฟังก์ชั่นส่งเหมือนด้านล่าง

แบบฟอร์ม HTML

<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:

<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>

สำหรับรายละเอียดเพิ่มเติมและเยี่ยมชมตัวอย่าง: http://www.spiderscode.com/simple-ajax-contact-form/


2

นี่ไม่ใช่คำตอบสำหรับคำถามของ OP
แต่ในกรณีที่คุณไม่สามารถใช้ DOM ในรูปแบบคงที่คุณสามารถลองแบบนี้ได้เช่นกัน

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

ลอง

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


1

เพียงแค่การเตือนความจำที่เป็นมิตรที่dataสามารถเป็นวัตถุได้

$('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

นอกจากนี้ยังมีกิจกรรมส่งซึ่งสามารถเรียกใช้เช่นนี้ $ ("# form_id") ส่ง () คุณจะใช้วิธีนี้ถ้าแบบฟอร์มนั้นมีการแสดงใน HTML อยู่แล้ว คุณเพียงแค่อ่านในหน้าใส่ข้อมูลแบบฟอร์มกับสิ่งต่าง ๆ แล้วโทร. ส่ง () มันจะใช้วิธีการและการกระทำที่กำหนดไว้ในการประกาศของแบบฟอร์มดังนั้นคุณไม่จำเป็นต้องคัดลอกลงในจาวาสคริปต์ของคุณ

ตัวอย่าง


58
หากคุณลบโพสต์ของคุณคุณจะได้รับคะแนนการลงโทษที่ถูกพรากไปจากคุณ
sparkyspider

2
สิ่งนี้จะส่งแบบฟอร์ม แต่ไม่ใช่ผ่าน AJAX ดังนั้นอย่าตอบคำถาม
superluminary

11
สิ่งที่ @spider พูดรวมทั้งคุณจะได้รับตราที่ดีที่เรียกว่า "เพียร์ดัน"
nurettin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.