$ (this) .serialize () - Làm thế nào để thêm một giá trị?


105

hiện tại tôi có những thứ sau:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

Điều này hoạt động tốt, tuy nhiên tôi muốn thêm một giá trị vào dữ liệu, vì vậy tôi đã thử

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

Nhưng điều đó đã không đăng chính xác. Bất kỳ ý tưởng nào về cách bạn có thể thêm một mục vào chuỗi tuần tự hóa? Đây là một biến trang toàn cầu không phải là dạng cụ thể.


Bạn có thể làm rõ "điều đó không đăng đúng" nghĩa là gì không? Chuyện gì đã xảy ra? Máy chủ đã nhận được gì?
matt b

6
Có nên không '&NonFormValue=' + NonFormValue?
Wesley Murch

Câu trả lời:


103

Thay vì

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

bạn có thể muốn

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

Bạn nên cẩn thận mã hóa URL giá trị NonFormValuenếu nó có thể chứa bất kỳ ký tự đặc biệt nào.


1
sử dụng encodeURIComponentđể đảm bảo rằng NonFormValuekhông có bất kỳ ký tự đặc biệt
Yahya Uddin

197

Trong khi câu trả lời của matt b sẽ hoạt động, bạn cũng có thể sử dụng .serializeArray()để lấy một mảng từ dữ liệu biểu mẫu, sửa đổi nó và sử dụng jQuery.param()để chuyển đổi nó thành một biểu mẫu được mã hóa url. Bằng cách này, jQuery xử lý việc tuần tự hóa dữ liệu bổ sung cho bạn.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});

14
Đây chắc chắn là lựa chọn tốt nhất - để tuần tự hóa hoàn toàn cho jQuery, trong khi vẫn có khả năng thêm các giá trị mới vào những giá trị được truy xuất từ ​​biểu mẫu.
jcsanyi

5
Đây là cách tốt nhất để làm điều đó, không chơi với chuỗi
Brett Gregson

Đây phải là câu trả lời được chấp nhận. Sạch sẽ và đúng cách
Mike Aron

7

trước hết không nên

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

và thứ hai bạn có thể sử dụng

url: this.action + '?NonFormValue=' + NonFormValue,

hoặc nếu hành động đã chứa bất kỳ tham số nào

url: this.action + '&NonFormValue=' + NonFormValue,

Câu trả lời thứ hai của bạn sẽ không có tác dụng giống như những gì câu hỏi yêu cầu; NonFormValuesẽ được gửi dưới dạng tham số URL, không phải trong dữ liệu ĐÃ ĐĂNG. Điều này có thể không lý tưởng nếu a) bất kỳ thứ gì đang chạy ở phía máy chủ mong đợi nó được ĐĂNG (ví dụ: sử dụng request.POSTthay vì request.REQUESTtrong Django) hoặc b) NonFormValuelà thứ không nên xuất hiện trong thanh URL hoặc lịch sử vì lý do bảo mật hoặc vì đó là một giá trị nhất thời.
Leigh Brenecki,

6

Thêm mục trước và sau đó tuần tự hóa:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});

1
Không làm việc cho tôi là tốt. Mặc dù nó mở rộng đối tượng nhưng không hoạt động như mong đợi.
punitcse

5

Đừng quên bạn luôn có thể làm:

<input type="hidden" name="NonFormName" value="NonFormValue" />

ở dạng thực tế của bạn, có thể tốt hơn cho mã của bạn tùy trường hợp.


2

Chúng ta có thể làm như sau:

data = $form.serialize() + "&foo=bar";

Ví dụ:

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});

0

Bạn có thể viết một hàm bổ sung để xử lý dữ liệu biểu mẫu và bạn nên thêm dữ liệu không phải biểu mẫu của mình làm giá trị dữ liệu trong biểu mẫu. Xem ví dụ:

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

Sau đó, thêm jquery này để xử lý biểu mẫu

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}


0

cái này tốt hơn:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')

Vui lòng thêm mô tả chi tiết hơn về lý do tại sao đây là cách tiếp cận tốt hơn.
Đánh dấu

một mã dòng và bạn có thể sử dụng đối tượng json cho nhiều tham số hơn.
eugene
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.