โพสต์ jQuery () พร้อมซีเรียลไลซ์และข้อมูลพิเศษ


147

ฉันพยายามค้นหาว่าเป็นไปได้หรือไม่ที่จะโพสต์serialize()และข้อมูลอื่น ๆ ที่อยู่นอกฟอร์ม

นี่คือสิ่งที่ฉันคิดว่าจะทำงานได้ แต่จะส่ง'wordlist'และไม่ใช่ข้อมูลในแบบฟอร์ม

$.post("page.php",( $('#myForm').serialize(), { 'wordlist': wordlist }));

ไม่มีใครมีความคิดใด ๆ

คำตอบ:


329

คุณสามารถใช้serializeArray [เอกสาร]และเพิ่มข้อมูลเพิ่มเติม:

var data = $('#myForm').serializeArray();
data.push({name: 'wordlist', value: wordlist});

$.post("page.php", data);

11
อืมมม ฉันคิดว่าฉันชอบสิ่งนี้ดีกว่าโซลูชันของฉัน :) ฉันอาจเริ่มทำสิ่งนี้ในอนาคต
Michael Mior

@Gudradain: มันทำงานได้ดี: jsfiddle.net/fnjncqhv หากไม่ได้ผลสำหรับคุณคุณกำลังประสบปัญหาอื่น
เฟลิกซ์คลิง

ไม่มันไม่ jsfiddle.net/fnjncqhv/1 serializeArray () สร้างอาร์เรย์ของวัตถุแต่ละวัตถุที่มีคุณสมบัติเดียวถ้าวัตถุข้อมูลของคุณมีมากกว่า 1 คุณสมบัติ (เช่นในตัวอย่างของคุณ) มันสร้างวัตถุที่ไม่ถูกต้องและจะไม่ถูกผูกไว้กับ ฝั่งเซิร์ฟเวอร์ โปรดแก้ไขคำตอบของคุณเพื่อแก้ไขปัญหา
Gudradain

2
@Gudradain: โปรดดูความคิดเห็นของฉันในคำตอบของคุณ คุณผิด. serializeArrayไม่สร้างโครงสร้างที่คุณคิด ฉันไม่แน่ใจว่าคุณกำลังพยายามแสดงอะไรด้วยการสาธิตของคุณ คุณเพียงแค่แจ้งความยาวของอาเรย์ ถ้าฉันสาธิตไม่ได้โน้มน้าวให้คุณ, โปรดดูได้ที่เป็นเอกสาร
เฟลิกซ์คลิง

1
@ FelixKling ขออภัยสำหรับช่วงเวลาที่ล้มเหลวและขอบคุณสำหรับคำอธิบาย ไม่ทราบว่าคุณต้องการรูปแบบ {name: 'your-paramater-name', value: 'your-parameter-value'}, สำหรับทุกพารามิเตอร์ที่คุณต้องการเพิ่ม
Gudradain


9

ทางเลือกอื่นในกรณีที่คุณต้องการทำเช่นนี้ในการอัปโหลดไฟล์ ajax:

var data = new FormData( $('#form')[0] ).append( 'name' , value );

หรือแม้แต่ง่ายกว่า

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

    e.preventDefault();
    var data = new FormData( this ).append('name', value );

    // ... your ajax code here ...

    return false;

});

5

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

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeArray();
for (var key in data) {
    if (data.hasOwnProperty(key)) {
        postData.push({name:key, value:data[key]});
    }
}
$.post(url, postData, function(){});

หรือถ้าคุณเพิ่มวิธีserializeObject ()คุณสามารถทำสิ่งต่อไปนี้

var data = {name1: 'value1', name2: 'value2'};
var postData = $('#my-form').serializeObject();
$.extend(postData, data);
$.post(url, postData, function(){});

1
[{name: 'wordlist'}, {value: wordlist}]นี้โดยทั่วไปจะสร้างอาร์เรย์ที่ดูเหมือนว่า นั่นไม่ใช่ในรูปแบบที่ jQuery เข้าใจดังนั้นฉันสงสัยว่ามันใช้งานได้จริง
เฟลิกซ์คลิง

@FelixKling serializeArray () สร้าง [{name1: 'value1'}, {name2: 'value2'}] หากคุณมีข้อมูลวัตถุ {name3: 'value3', name4: 'value4'} และส่งไปยังอาร์เรย์จาก serializeArray () คุณจะได้รับ [{name1: 'value1'}, {name2: 'value2'}, { name3: 'value3', name4: 'value4'}] วัตถุสุดท้ายในอาร์เรย์ไม่ถูกต้องและคุณจะไม่ได้รับผลลัพธ์
Gudradain

" serializeArray()ผลิต[{name1: 'value1'}, {name2: 'value2'}]" ไม่ไม่: jsfiddle.net/akyz1Lcy
Felix Kling

4

ใน jquery เวอร์ชันใหม่สามารถทำได้ผ่านขั้นตอนต่อไปนี้:

  • รับอาร์เรย์ param ผ่าน serializeArray()
  • โทรpush()หรือวิธีการที่คล้ายกันเพื่อเพิ่มพารามิเตอร์เพิ่มเติมไปยังอาร์เรย์
  • การเรียกใช้$.param(arr)เพื่อรับสตริงที่ทำให้เป็นอนุกรมซึ่งสามารถใช้เป็นdataพารามิเตอร์ของ jquery ajax

รหัสตัวอย่าง:

var paramArr = $("#loginForm").serializeArray();
paramArr.push( {name:'size', value:7} );
$.post("rest/account/login", $.param(paramArr), function(result) {
    // ...
}

3
$.ajax({    
    type: 'POST',  
    url: 'test.php',  
    data:$("#Test-form").serialize(),  
    dataType:'json',
     beforeSend:function(xhr, settings){
     settings.data += '&moreinfo=MoreData';
     },
    success:function(data){
            //  json response  
    },
    error: function(data) { 
        // if error occured
    }
    });

2

คุณสามารถมีแบบฟอร์มที่มีข้อมูลเพิ่มเติมเป็นเขตข้อมูลที่ซ่อนอยู่ซึ่งคุณจะตั้งค่าก่อนที่จะส่งคำขอ AJAX ไปยังค่าที่สอดคล้องกัน

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

var data = $('#myForm').serializeObject();
// now add some additional stuff
data['wordlist'] = wordlist;
$.post('/page.php', data);

serializeObjectไม่มีฟังก์ชั่นที่มีอยู่ชื่อเป็น คุณได้รับมาจากไหน
Jereme ทำให้


0

ฉันชอบที่จะเก็บวัตถุไว้เป็นวัตถุและไม่ทำสิ่งที่เปลี่ยนแบบบ้าคลั่ง นี่คือวิธีของฉัน

var post_vars = $('#my-form').serializeArray();
$.ajax({
  url: '//site.com/script.php',
  method: 'POST',
  data: post_vars,
  complete: function() {
    $.ajax({
      url: '//site.com/script2.php',
      method: 'POST',
      data: post_vars.concat({
        name: 'EXTRA_VAR',
        value: 'WOW THIS WORKS!'
      })
    });
  }
});

หากคุณไม่เห็นจากด้านบนฉันใช้ฟังก์ชัน. catcat และส่งผ่านวัตถุที่มีตัวแปร post เป็น 'name' และค่าเป็น 'value'!

หวังว่านี่จะช่วยได้

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