$ (this) .serialize () - จะเพิ่มค่าได้อย่างไร?


106

ตอนนี้ฉันมีสิ่งต่อไปนี้:

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

วิธีนี้ใช้งานได้ดี แต่ฉันต้องการเพิ่มมูลค่าให้กับข้อมูลดังนั้นฉันจึงลอง

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

แต่นั่นไม่ได้โพสต์อย่างถูกต้อง มีแนวคิดเกี่ยวกับวิธีเพิ่มรายการลงในสตริงซีเรียลไลซ์หรือไม่? นี่คือตัวแปรหน้าส่วนกลางที่ไม่เจาะจงรูปแบบ


คุณช่วยชี้แจงได้ไหมว่า "ที่โพสต์ไม่ถูกต้อง" หมายถึงอะไร เกิดอะไรขึ้น? เซิร์ฟเวอร์ได้รับอะไร
matt b

6
ไม่ควรอย่างนั้น'&NonFormValue=' + NonFormValueหรือ?
Wesley Murch

คำตอบ:


103

แทน

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

คุณอาจต้องการ

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

คุณควรระมัดระวังในการเข้ารหัส URL ค่าNonFormValueว่าอาจมีอักขระพิเศษหรือไม่


1
ใช้encodeURIComponentเพื่อให้แน่ใจว่าNonFormValueไม่มีอักขระพิเศษใด ๆ
Yahya Uddin

199

แม้ว่าคำตอบของ matt b จะใช้งานได้ แต่คุณยังสามารถใช้.serializeArray()เพื่อรับอาร์เรย์จากข้อมูลฟอร์มแก้ไขและใช้jQuery.param()เพื่อแปลงเป็นรูปแบบที่เข้ารหัส URL ได้ ด้วยวิธีนี้ jQuery จะจัดการซีเรียลไลเซชั่นของข้อมูลเพิ่มเติมให้คุณ

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

14
นี่เป็นตัวเลือกที่ดีที่สุดอย่างแน่นอน - ปล่อยให้การทำให้เป็นอนุกรมทั้งหมดเป็น jQuery ในขณะที่ยังมีความสามารถในการเพิ่มค่าใหม่ให้กับค่าที่ดึงมาจากฟอร์ม
jcsanyi

5
นี่เป็นวิธีที่ดีที่สุดที่จะทำโดยไม่ต้องเล่นกับสตริง
Brett Gregson

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ สะอาดและถูกวิธี
Mike Aron

7

ประการแรกไม่ควร

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

เป็น

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

และประการที่สองคุณสามารถใช้ได้

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

หรือหากการดำเนินการมีพารามิเตอร์อยู่แล้ว

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

คำตอบที่สองของคุณจะไม่มีผลเช่นเดียวกับคำถามที่ถาม NonFormValueจะถูกส่งเป็นพารามิเตอร์ URL ไม่ใช่ในข้อมูล POSTed สิ่งนี้อาจไม่เหมาะอย่างยิ่งหาก a) สิ่งใดก็ตามที่ทำงานบนฝั่งเซิร์ฟเวอร์คาดว่าจะถูก POSTed (เช่นใช้request.POSTแทนrequest.REQUESTใน Django) หรือ b) NonFormValueเป็นสิ่งที่ไม่ควรปรากฏในแถบ URL หรือประวัติด้วยเหตุผลด้านความปลอดภัยหรือเนื่องจาก มันเป็นค่าชั่วคราว
Leigh Brenecki

6

เพิ่มรายการก่อนแล้วจึงทำให้เป็นอนุกรม:

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

1
ไม่ได้ผลสำหรับฉันเช่นกัน แม้ว่าจะขยายวัตถุ แต่ไม่ได้ผลตามที่คาดไว้
ลงโทษ

5

อย่าลืมว่าคุณสามารถทำได้เสมอ:

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

ในรูปแบบจริงของคุณซึ่งอาจดีกว่าสำหรับรหัสของคุณขึ้นอยู่กับกรณี


2

เราสามารถทำได้เช่น:

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

ตัวอย่างเช่น:

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

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

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

จากนั้นเพิ่ม jquery นี้สำหรับการประมวลผลแบบฟอร์ม

<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

ดีกว่านี้:

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

โปรดเพิ่มคำอธิบายโดยละเอียดว่าเหตุใดจึงเป็นแนวทางที่ดีกว่า
เครื่องหมาย

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