ส่งแบบฟอร์มทั้งหมดเป็นข้อมูลในฟังก์ชัน jQuery Ajax


155

ฉันมีฟังก์ชั่น jQuery ajax และต้องการส่งแบบฟอร์มทั้งหมดเป็นข้อมูลโพสต์ เราอัปเดตฟอร์มอย่างต่อเนื่องดังนั้นจึงเป็นเรื่องน่าเบื่อที่จะต้องอัปเดตฟอร์มที่ควรส่งในคำขอ


Moh ถูกต้องเกี่ยวกับ FormData () และรูปภาพ แต่ต้องชี้แจงเพิ่มเติม เป็นอนุกรมที่ใช้งานได้เฉพาะกับสตริง (ไม่ใช่ข้อมูลไบนารี) ฟังก์ชัน FormData () ทำงานกับฟอร์มที่มีประเภทการเข้ารหัสที่ตั้งค่าเป็น "multipart / form-data" รายละเอียดที่นี่: developer.mozilla.org/en-US/docs/Web/API/FormData
james kenny

คำตอบ:


283

มีฟังก์ชั่นที่ทำสิ่งนี้อย่างแน่นอน:

http://api.jquery.com/serialize/

var data = $('form').serialize();
$.post('url', data);

3
$. โพสต์ยังสามารถเรียกใช้ฟังก์ชันได้สำเร็จ $ .post ('url', data, function () {.... });
slm

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

สิ่งที่เป็นฉันจำเป็นต้องป้อนข้อมูลบางส่วนด้วยเหมือนกันชื่อ ? ฉันหมายถึงเหมือนมีพวกเขาในแถว? ฉันจะส่งสิ่งนั้นในอาร์เรย์หรือบางสิ่งได้อย่างไร
Francisco Corrales Morales

2
@FranciscoCorralesMorales ตั้งชื่ออินพุตของคุณด้วยวิธีนี้:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri

@ahmehri นี่คือ HTML ที่ถูกต้อง<input name="person[1].lastName">หรือไม่
Francisco Corrales Morales

59

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

สมมติว่าเรามีฟอร์มที่มี ID นี้: "myform"

ทางออกที่ดีกว่าคือการสร้าง FormData และส่ง:

    var myform = document.getElementById("myform");
    var fd = new FormData(myform );
    $.ajax({
        url: "example.php",
        data: fd,
        cache: false,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (dataofconfirm) {
            // do something with the result
        }
    });

1
ใช่มันได้รับการสนับสนุนโดยเบราว์เซอร์ที่อัปเดต แต่โดยใช้ซีเรียลไลซ์คุณจะสามารถส่งผ่านสตริงได้เท่านั้น
Moh Arjmandi

4
บางทีคุณควรพูดถึงสิ่งนั้นในคำตอบของคุณ
toesslab

ขอบคุณสำหรับทั้งคู่varในปี 2559!
Sylar

1
คุณสวย! ทำงานเหมือน
เครื่องราง

2
ไม่สามารถเน้นได้เพียงพอ! ลองแล้วform.serialize()แต่ใช้งานไม่ได้กับการอัปโหลดไฟล์ new FormData(this)ทำงานได้ดี
Sasanka Panguluri

26

โดยทั่วไปใช้serialize()กับองค์ประกอบแบบฟอร์ม

โปรดระลึกไว้ว่าตัวเลือก <select> หลายรายการนั้นต่อเนื่องกันภายใต้คีย์เดียวกันเช่น

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>

จะส่งผลให้เกิดสตริงการสืบค้นที่มีการเกิดขึ้นหลายครั้งของพารามิเตอร์การสืบค้นเดียวกัน:

[path]?foo=1&foo=2&foo=3&someotherparams...

ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการในแบ็กเอนด์

ฉันใช้รหัส JS นี้เพื่อลดพารามิเตอร์หลายตัวให้เป็นคีย์เดี่ยวที่คั่นด้วยเครื่องหมายจุลภาค (คัดลอกอย่างไร้ยางอายจากการตอบสนองของผู้แสดงความคิดเห็นในเธรดที่ตำแหน่งของ John Resig):

function compress(data) {
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}

ซึ่งเปลี่ยนข้างต้นเป็น:

[path]?foo=1,2,3&someotherparams...

ในรหัส JS ของคุณคุณจะเรียกมันว่า:

var inputs = compress($("#your-form").serialize());

หวังว่าจะช่วย


หากคุณใช้ PHP เป็นเรื่องง่ายที่จะแยกวิเคราะห์ข้อความโดยใช้ฟังก์ชั่นparse_url
Lobos

ฉันรู้ว่ามันเก่า แต่คุณรู้ได้อย่างไรว่าตัวเลือกใดถูกเลือกใช้วิธีนี้
yardpenalty.com


4

ตัวเลือก jQuery ที่ดีที่จะทำเช่นนี้คือผ่านFormData วิธีนี้ยังเหมาะสมเมื่อส่งไฟล์ผ่านแบบฟอร์ม!

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>

ฟังก์ชั่นส่งของคุณใน jQuery จะมีลักษณะเช่นนี้:

$( 'form#test' ).submit( function(){
   var data = new FormData( $( 'form#test' )[ 0 ] );

   $.ajax( {
      processData: false,
      contentType: false,

      data: data,
      dataType: 'json',
      type: $( this ).attr( 'method' );
      url: 'yourapi.php',
      success: function( feedback ){
         console.log( "the feedback from your API: " + feedback );
      }
});

เพื่อเพิ่มข้อมูลลงในแบบฟอร์มของคุณคุณสามารถใช้อินพุตที่ซ่อนอยู่ในแบบฟอร์มของคุณหรือเพิ่มข้อมูลได้ทันที:

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );

2
หากต้องการแยก URL จากแอตทริบิวต์ "การกระทำ" ของแบบฟอร์มให้ใช้url: $(this).attr('action'),แทน
rubo77

1

คุณต้องโพสต์ข้อมูล และการใช้พารามิเตอร์ชุดฟังก์ชั่น jquery ajax นี่คือตัวอย่าง

<script>
        $(function () {

            $('form').on('submit', function (e) {

                e.preventDefault();

                $.ajax({
                    type: 'post',
                    url: 'your_complete url',
                    data: $('form').serialize(),
                    success: function (response) {
                        //$('form')[0].reset();
                       // $("#feedback").text(response);
                        if(response=="True") {
                            $('form')[0].reset();
                            $("#feedback").text("Your information has been stored.");
                        }
                        else
                            $("#feedback").text(" Some Error has occured Errror !!! ID duplicate");
                    }
                });

            });

        });
    </script>

0

โซลูชันอื่น ๆ ใช้ไม่ได้สำหรับฉัน อาจเป็น DOCTYPE เก่าในโครงการที่ฉันกำลังทำงานเพื่อป้องกันตัวเลือก HTML5

ทางออกของฉัน:

<form id="form_1" action="result.php" method="post"
 onsubmit="sendForm(this.id);return false">
    <input type="hidden" name="something" value="1">
</form>

js:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.