jQuery - เพิ่มพารามิเตอร์เพิ่มเติมในการส่ง (ไม่ใช่อาแจ็กซ์)


206

ใช้ jQuery's 'ส่ง' - มีวิธีส่งพารามิเตอร์เพิ่มเติมไปยังแบบฟอร์มหรือไม่ ฉันไม่ได้ต้องการทำเช่นนี้กับ Ajax - นี่เป็นเรื่องปกติที่จะส่งแบบฟอร์มการรีเฟรชทั่วไป

$('#submit').click(function () {
    $('#event').submit(function () {
        data: { 
        form['attendees'] = $('#attendance').sortable('toArray').toString();
    });
});

คุณใช้เทคโนโลยีด้านเซิร์ฟเวอร์ใด
Enrique

ดูคำตอบของฉัน [ที่นี่] [1] ซึ่งต่อท้ายแบบฟอร์มต่อเนื่องก่อนส่ง [1]: stackoverflow.com/questions/17809056/…
Jeff Lowery

คำตอบ:


371

อันนี้ทำเพื่อฉัน:

var input = $("<input>")
               .attr("type", "hidden")
               .attr("name", "mydata").val("bla");
$('#form1').append(input);

ขึ้นอยู่กับคำตอบของ Daff แต่เพิ่มแอตทริบิวต์ NAME เพื่อให้มันแสดงในการรวบรวมฟอร์มและเปลี่ยน VALUE เป็น VAL ตรวจสอบ ID ของ FORM (form1 ในกรณีของฉัน)

ใช้ Firefox firebug เพื่อตรวจสอบว่าองค์ประกอบถูกแทรกหรือไม่

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

มิเชล


46
ฉันจะร้องเพลง 'คุณเป็นแสงแดดของฉัน' ในระบบเลขฐานสองได้อย่างไร ขอบคุณมาก. สิ่งนี้สามารถแก้ไขได้หลายอย่าง
Ciel

38
คุณสามารถปรับปรุงความสามารถในการอ่านได้เล็กน้อย: var input = $ ("<input>", {type: "hidden", ชื่อ: "mydata", ค่า: "bla"}); $ ( '# Form1') ผนวก ($ (input)).
Konstantine Kalbazov

2
$ ("<input>") .attr ("type", "hidden"). attr ("ชื่อ", "mydata"). val ("bla"). appendTo ('# form1'); เป็นอีกวิธีหนึ่ง
kiev

6
ฉันชอบคอมโบของ: $ ("<input>", {ประเภท: "ซ่อน", ชื่อ: "mydata", ค่า: "bla"}). appendTo ("# form1");
gabeio

ขนาดของข้อมูลมีข้อ จำกัด หรือไม่ ฉันส่งวัตถุขนาดใหญ่โดยใช้ JSON.stringify (obj) และวิธีการนี้และดูเหมือนว่าจะถูกตัดทอน
omikron

26

ในกรณีของคุณมันควรจะพอเพียงเพิ่มฟิลด์อื่นที่ซ่อนอยู่ในแบบฟอร์มของคุณแบบไดนามิก

var input = $("<input>").attr("type", "hidden").val("Bla");
$('#form').append($(input));

ข้อมูลที่ฉันต้องส่งไม่สามารถใช้แบบฟอร์มได้ จะต้องมีการจับภาพและจัดการในฝั่งเซิร์ฟเวอร์
Ciel

คุณหมายถึงอะไรโดย "ไม่สามารถฟอร์มได้"
Vincent Ramdhanie

ขออภัย - มันไม่ได้ผลเลย แม้จะมีเพียงข้อมูลที่ถูกบังคับ แต่ก็ไม่ได้แทรกลงในแบบฟอร์ม
Ciel

ไม่สามารถวางในฟิลด์ฟอร์ม
Ciel

2
ถ้าสตริงมันสามารถใส่ในเขตข้อมูลแบบ
PetersenDidIt

19

คุณยังสามารถใช้อันนี้ ทำงานได้ดีสำหรับฉัน

$("#registerform").attr("action", "register.php?btnsubmit=Save") 
$('#registerform').submit();

สิ่งนี้จะส่ง btnsubmit = บันทึกเป็นค่า GET เพื่อลงทะเบียน form.php


ดูเหมือนว่าจะเป็นทางออกที่ดีกว่า เพียงจำไว้ว่าให้ใช้encodeURIComponent()สำหรับค่าพารามิเตอร์ขึ้นอยู่กับประเภทของข้อมูล
Andres SK

1
อันนี้ดีกว่าจริง ๆ เมื่ออนุญาตให้ผู้ใช้ส่งแบบฟอร์มหลายครั้ง แบบฟอร์มจะไม่ได้รับมากกว่าหนึ่งเขตข้อมูลที่ซ่อนอยู่ด้วยค่าที่แตกต่างกัน
เมลลอน

11

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

// This must be applied to a form (or an object inside a form).
jQuery.fn.addHidden = function (name, value) {
    return this.each(function () {
        var input = $("<input>").attr("type", "hidden").attr("name", name).val(value);
        $(this).append($(input));
    });
};

จากนั้นเพิ่มฟิลด์ที่ซ่อนไว้ก่อนที่คุณจะส่ง:

var frm = $("#form").addHidden('SaveAndReturn', 'Save and Return')
                    .submit();

1
ดูstackoverflow.com/questions/2601223/…สำหรับ addHidden เวอร์ชันขั้นสูงเพิ่มเติม
Jonathan

1
ฉันชอบความเรียบง่ายของโซลูชันนี้ มันไม่ได้จัดการกับหลายกรณี แต่มันก็จัดการกับมันได้ดี
Phil

11

คุณไม่จำเป็นต้องผูกเหตุการณ์ส่งเมื่อคลิกปุ่มส่งเพียงผูกเหตุการณ์ส่งและมันจะจับเหตุการณ์ส่งไม่มีสาระสำคัญว่าจะได้รับการเรียก

คิดว่าสิ่งที่คุณต้องการคือการส่งเรียงลำดับเช่นเดียวกับคุณผ่านทาง ajax ลองทำสิ่งนี้:

var form = $('#event').submit(function () {
    $.each($('#attendance').sortable('toArray'),function(i, value){
        $("<input>").attr({
            'type':'hidden',
            'name':'attendace['+i+']'
        }).val(value).appendTo(form);
    });
});

ยังคงไม่แสดงในรูปแบบการเก็บรวบรวมด้านเซิร์ฟเวอร์ ... มีสิ่งพิเศษที่ฉันต้องทำเพื่อให้ได้ฟิลด์ที่ซ่อนอยู่เพื่อแสดงบนเซิร์ฟเวอร์หรือไม่? มันจะผ่าน C # / ASP.NET MVC โดยใช้วัตถุ FormCollection
Ciel

อัปเดตคำตอบของฉันคิดว่าฉันทำในสิ่งที่คุณพยายามจะทำ
PetersenDidIt

คุณกำลังเพิ่มnameคุณสมบัติให้กับการป้อนแบบฟอร์มที่ซ่อนอยู่ที่สร้างขึ้น? ตามstackoverflow.com/questions/504681/…ดูเหมือนว่าวัตถุ FormCollection ต้องการ<input>องค์ประกอบทั้งหมดที่จะมีชื่อ
npdoty

ใช่ฉันพยายามที่จะผลักดันการเรียงลำดับใน formcollection เป็นสตริงของค่าที่คั่นด้วยเครื่องหมายจุลภาค ฉันลองอัปเดตของคุณแล้ว แต่ก็ยังไม่โพสต์ ฉันไม่แน่ใจว่าสิ่งที่ฉันทำผิด ... ฉันขอขอบคุณความช่วยเหลือ
Ciel

ดูเหมือนว่าปัญหาไม่ได้อยู่ที่ฝั่งไคลเอ็นต์ แต่เป็นฝั่งเซิร์ฟเวอร์
PetersenDidIt

2

คำตอบที่คล้ายกัน แต่ฉันแค่อยากให้มันใช้ได้สำหรับการทดสอบที่ง่าย / รวดเร็ว

var input = $("<input>")
               .attr("name", "mydata").val("go Rafa!");

$('#easy_test').append(input);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>



<form id="easy_test">
  
</form>

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