jQuery post () với tuần tự hóa và dữ liệu bổ sung


147

Tôi đang cố gắng tìm hiểu xem có thể đăng serialize()và các dữ liệu khác ngoài biểu mẫu không.

Đây là những gì tôi nghĩ sẽ làm việc, nhưng nó chỉ gửi 'wordlist'và không phải dữ liệu biểu mẫu.

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

Có ai có ý tưởng nào?

Câu trả lời:


329

Bạn có thể sử dụng serializeArray [tài liệu] và thêm dữ liệu bổ sung:

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

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

11
Hừm. Tôi nghĩ rằng tôi thích điều này tốt hơn giải pháp của tôi :) Tôi có thể bắt đầu làm điều này trong tương lai.
Michael Mior

@Gudradain: Nó hoạt động tốt: jsfiddle.net/fnjncqhv . Nếu nó không hiệu quả với bạn, bạn đang phải đối mặt với một vấn đề khác.
Felix Kling

Không, nó không có. jsfiddle.net/fnjncqhv/1 serializeArray () tạo ra một mảng các đối tượng, mỗi đối tượng chứa một thuộc tính, nếu đối tượng dữ liệu của bạn chứa nhiều hơn 1 thuộc tính (như trong ví dụ của bạn), nó tạo ra một đối tượng không hợp lệ và sẽ không bị ràng buộc phía máy chủ. Vui lòng chỉnh sửa câu trả lời của bạn để khắc phục vấn đề.
Gudradain

2
@Gudradain: Xin vui lòng xem nhận xét của tôi về câu trả lời của bạn. Bạn sai rồi. serializeArraykhông tạo ra cấu trúc mà bạn nghĩ nó làm. Tôi không chắc chắn những gì bạn đang cố gắng thể hiện với bản demo của bạn. Bạn chỉ đang cảnh báo độ dài của mảng. Nếu bản demo của tôi không thuyết phục được bạn, xin vui lòng xem tài liệu .
Felix Kling

1
@FelixKling Xin lỗi vì khoảnh khắc thất bại đó và cảm ơn bạn đã giải thích. Không nhận ra bạn thực sự cần định dạng {name: 'your-paramater-name', value: 'your -ameter-value'}, cho mọi tham số mà bạn muốn thêm.
Gudradain


9

Một giải pháp thay thế, trong trường hợp bạn cần thực hiện việc này khi tải lên tệp ajax:

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

HOẶC thậm chí đơn giản hơn.

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

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

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

    return false;

});

5

Khi bạn muốn thêm một đối tượng javascript vào dữ liệu biểu mẫu, bạn có thể sử dụng đoạn mã sau

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

Hoặc nếu bạn thêm phương thức serializeObject () , bạn có thể làm như sau

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

1
Điều này về cơ bản sẽ tạo ra một mảng trông như thế nào [{name: 'wordlist'}, {value: wordlist}]. Đó không phải là định dạng mà jQuery hiểu, vì vậy tôi nghi ngờ điều này thực sự hoạt động.
Felix Kling

@FelixKling serializeArray () tạo ra [{name1: 'value1'}, {name2: 'value2'}]. Nếu bạn có dữ liệu đối tượng {name3: 'value3', name4: 'value4'} và đẩy nó vào mảng từ serializeArray (), bạn nhận được [{name1: 'value1'}, {name2: 'value2'}, { tên3: 'value3', name4: 'value4'}]. Đối tượng cuối cùng trong mảng không hợp lệ và bạn sẽ không nhận được kết quả.
Gudradain

" serializeArray()sản xuất [{name1: 'value1'}, {name2: 'value2'}]." Không, nó không: jsfiddle.net/akyz1Lcy
Felix Kling

4

Trong phiên bản mới của jquery, có thể thực hiện nó thông qua các bước sau:

  • lấy mảng param qua serializeArray()
  • gọi push()hoặc các phương thức tương tự để thêm tham số bổ sung vào mảng,
  • gọi $.param(arr)để nhận chuỗi nối tiếp, có thể được sử dụng như dataparam của jquery ajax .

Mã ví dụ:

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

Bạn có thể có biểu mẫu chứa dữ liệu bổ sung dưới dạng các trường ẩn mà bạn sẽ đặt ngay trước khi gửi yêu cầu AJAX đến các giá trị tương ứng.

Một khả năng khác bao gồm sử dụng viên ngọc nhỏ này để tuần tự hóa biểu mẫu của bạn thành một đối tượng javascript (thay vì chuỗi) và thêm dữ liệu bị thiếu:

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

Không có chức năng hiện có tên serializeObject. Bạn lấy thứ đó ở đâu?
Jereme gây ra

1

Bạn có thể sử dụng cái này

var data = $("#myForm").serialize();
data += '&moreinfo='+JSON.stringify(wordlist);

0

Tôi thích giữ các đối tượng như các đối tượng và không làm bất kỳ sự thay đổi kiểu điên rồ nào. Đây là cách của tôi

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

nếu bạn không thể nhìn thấy ở trên, tôi đã sử dụng hàm .concat và truyền vào một đối tượng có biến bài là 'tên' và giá trị là 'giá trị'!

Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.