ส่งแบบฟอร์มโดยใช้ jQuery [ปิด]


476

ฉันต้องการส่งแบบฟอร์มโดยใช้ jQuery ใครสามารถให้รหัสตัวอย่างหรือลิงค์ตัวอย่าง?

คำตอบ:


482

ขึ้นอยู่กับว่าคุณส่งแบบฟอร์มปกติหรือผ่านการโทร AJAX คุณสามารถค้นหาข้อมูลมากมายได้ที่jquery.comรวมถึงเอกสารประกอบพร้อมตัวอย่าง สำหรับการส่งแบบฟอร์มตามปกติให้ตรวจสอบsubmit()วิธีการไปที่ไซต์นั้น สำหรับAJAXมีความเป็นไปได้ที่แตกต่างกันมากมายแม้ว่าคุณอาจต้องการใช้วิธีการajax()หรือpost()วิธีการ โปรดทราบว่าpost()นี่เป็นวิธีที่สะดวกในการเรียกใช้ajax()เมธอดด้วยอินเตอร์เฟสที่เรียบง่ายและ จำกัด

ทรัพยากรที่สำคัญอย่างหนึ่งที่ฉันใช้ทุกวันที่คุณควรคั่นหน้าไว้คือjQuery ทำงานอย่างไรอย่างไร มีแบบฝึกหัดเกี่ยวกับการใช้ jQuery และการนำทางด้านซ้ายให้การเข้าถึงเอกสารทั้งหมด

ตัวอย่าง:

ปกติ

$('form#myForm').submit();

AJAX

$('input#submitButton').click( function() {
    $.post( 'some-url', $('form#myForm').serialize(), function(data) {
         // ... do something with response from server
       },
       'json' // I expect a JSON response
    );
});

$('input#submitButton').click( function() {
    $.ajax({
        url: 'some-url',
        type: 'post',
        dataType: 'json',
        data: $('form#myForm').serialize(),
        success: function(data) {
                   // ... do something with the data...
                 }
    });
});

โปรดทราบว่าajax()และpost()วิธีการข้างต้นเทียบเท่ากัน มีพารามิเตอร์เพิ่มเติมที่คุณสามารถเพิ่มลงในajax()คำขอเพื่อจัดการข้อผิดพลาด ฯลฯ


3
ฉันขาดวิธีการทำให้เป็นอันดับ เห็นได้ชัดว่าฉันดู jQuery.com แต่เอกสารของพวกเขาเกี่ยวกับการ$.postแยกแยะและสร้างแบบฟอร์มใหม่เพื่อสร้างข้อมูลที่จะส่ง ขอบคุณ!
nomen

1
หากฉันมีข้อมูลบางอย่างพร้อมฉันต้องการเพิ่มลงในคำขอโพสต์ (ไม่ใช่ ajax, ส่งแบบฟอร์มขอโพสต์) ก่อนที่จะส่งฉันจะทำอย่างไร
アレックス

1
@AlexanderSupertramp - ในตัวอย่างด้านบนข้อมูลจะถูกส่งเป็นพารามิเตอร์แบบฟอร์มที่เข้ารหัส URL คุณสามารถผนวกข้อมูลเป็นพารามิเตอร์แบบฟอร์มเพิ่มเติมได้ $('form#MyForm').serialize() + '&newData=' + newData + '&moreData=' + moreData. หมายเหตุ: หลังสองอาจจะต้องมีการเข้ารหัส URL encodeURIComponent()ใช้ หรือ - คุณสามารถเปลี่ยนเพื่อใช้การเข้ารหัส JSON ที่ปลายทั้งสองด้าน แต่จากนั้นคุณจะต้องใส่ข้อมูลฟอร์มลงในโครงสร้างข้อมูล JavaScript ด้วยข้อมูลเพิ่มเติมของคุณและทำให้เป็นอันดับ ในกรณีนี้คุณอาจใช้serializeArrayแบบฟอร์มและรวมข้อมูลอื่นของคุณเข้าด้วย
tvanfosson

"ฉันคาดหวังว่าการตอบสนองแบบ json" จะแก้ไขปัญหาที่แตกต่างสำหรับฉัน (การโทรไปยัง Flask ล้มเหลว)
scharfmn

หากคุณมีปุ่มส่งชื่อ 'ส่ง' สิ่งนี้จะล้มเหลวอย่างเงียบ ๆ (jQuery) หรือเกิดข้อผิดพลาดว่า "ส่งไม่ใช่ฟังก์ชั่น" (vanilla js) การเปลี่ยนชื่อปุ่มเพื่อสิ่งอื่นที่จะแก้ไข ¯_ (ツ) _ / ¯🤷
fzzylogic

122

$("#formId").submit()คุณจะต้องใช้

โดยทั่วไปคุณจะเรียกสิ่งนี้จากภายในฟังก์ชั่น

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

<input type='button' value='Submit form' onClick='submitDetailsForm()' />

<script language="javascript" type="text/javascript">
    function submitDetailsForm() {
       $("#formId").submit();
    }
</script>

คุณจะได้รับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในเว็บไซต์ Jquery


55
หากคุณใช้ jQuery ทำไมคุณถึงใช้แอตทริบิวต์ inclick แบบอินไลน์?
nnnnnn

3
@BradleyFlood - เขาควรทำอย่างไรแทน มือใหม่ชอบที่เราอยากจะรู้?
MarcoZen

2
@MarcoZen ฉันคิดว่า BradleyFlood กำลังชี้ให้เห็นว่าวลี "ตัวอย่าง:" หมายความว่าการใช้แอตทริบิวต์ inline onclick เป็นวิธีหนึ่งที่เป็นไปได้ แท้จริงแล้ว jQuery ที่เหมือนจะใช้. on ('คลิก', submitDetailsForm)
Jan Kukacka

@JanKukacka - สังเกต ขอบคุณ
MarcoZen

71

เมื่อคุณมีแบบฟอร์มที่มีอยู่ตอนนี้ควรทำงานกับ jquery - ajax / โพสต์ตอนนี้คุณสามารถ:

  • เข้าสู่การส่ง - เหตุการณ์ของแบบฟอร์มของคุณ
  • ป้องกันการทำงานเริ่มต้นของการส่ง
  • ทำสิ่งที่คุณเอง

    $(function() {
        //hang on event of form with id=myform
        $("#myform").submit(function(e) {
    
            //prevent Default functionality
            e.preventDefault();
    
            //get the action-url of the form
            var actionurl = e.currentTarget.action;
    
            //do your own request an handle the results
            $.ajax({
                    url: actionurl,
                    type: 'post',
                    dataType: 'application/json',
                    data: $("#myform").serialize(),
                    success: function(data) {
                        ... do something with the data...
                    }
            });
    
        });
    
    });

โปรดทราบว่าเพื่อให้serialize()ฟังก์ชันทำงานในตัวอย่างด้านบนองค์ประกอบแบบฟอร์มทั้งหมดจะต้องมีการnameกำหนดแอตทริบิวต์

ตัวอย่างของแบบฟอร์ม:

<form id="myform" method="post" action="http://example.com/do_recieve_request">

<input type="text" size="20" value="default value" name="my_input_field">
..
.
</form>

@PtF - ข้อมูลถูกส่งโดยใช้ POST ในตัวอย่างนี้ดังนั้นหมายความว่าคุณสามารถเข้าถึงข้อมูลของคุณผ่านทาง

 $_POST['dataproperty1'] 

โดยที่ dataproperty1 คือ "variable-name" ใน json ของคุณ

ตัวอย่างไวยากรณ์ที่นี่ถ้าคุณใช้ CodeIgniter:

 $pdata = $this->input->post();
 $prop1 = $pdata['prop1'];
 $prop1 = $pdata['prop2'];

เหตุใดคุณจึงใช้ตัวเลือกของแบบฟอร์มซ้ำทำไมไม่นำองค์ประกอบแบบฟอร์มมาใช้ซ้ำ
Slava Fomin II

ใช่คุณสามารถทำสิ่งนี้ได้เช่นกัน: <form id = "myform" onsubmit = "do_stuff ()"> แต่ถ้า js ถูกโหลดในภายหลัง / เลื่อนไปที่ฟังก์ชั่นนั้นอาจไม่พร้อมใช้งาน .. ดังนั้นฉันคิดว่าการเริ่มต้นนี้บนเอกสาร พร้อม .... ฉันไม่แน่ใจว่าฉันเป็นความคิดเดียวกันคุณสามารถอธิบายสิ่งที่คุณทำอยู่?
womd

1
ขอบคุณที่เน้นว่าจะต้องกำหนดแอตทริบิวต์ "name"
ccalboni

1
DataType: 'application / json' เป็นข้อผิดพลาด ควรอ่าน dataType: 'json' คุณจะได้รับข้อผิดพลาดในการแยกวิเคราะห์หากถูกทิ้งไว้ในตัวอย่างด้านบน
Hankster

@ แฮงค์เตอร์ใช่ถูก json แต่ได้รับการแก้ไข ... ชาวฮอลแลนด์สามารถตรวจสอบ / ยืนยันได้หรือไม่?
womd

68

ใน jQuery ฉันต้องการสิ่งต่อไปนี้:

$("#form-id").submit()

แต่จากนั้นอีกครั้งคุณไม่จำเป็นต้องใช้ jQuery เพื่อทำงานดังกล่าวเพียงแค่ใช้ JavaScript ปกติ:

document.getElementById("form-id").submit()

1
@windmaomao คุณรวม jQuery ไว้ในหน้าเว็บของคุณหรือไม่ อาจเป็นไปได้ว่าคุณจำเป็นต้องใช้ jQuery istead ของ $ aswell อย่างไรก็ตาม - ฉันแนะนำให้ใช้โซลูชัน JS ปกติยกเว้นว่าคุณมี jQuery รวมอยู่ด้วย
gernberg

1
@windmaomao ฉันมีปัญหาเดียวกัน jQuery ของฉันรันฟังก์ชั่นอื่น ๆ ทั้งหมด แต่จะไม่ส่งแบบฟอร์ม มันทำงานได้โดยใช้เมธอด document.getElementById
ChallengeAccepted

41

จากคู่มือ: jQuery Doc

$("form:first").submit();

3
มันเป็นเรื่องยากที่จะส่งแบบฟอร์มโดย "id" มากกว่าการค้นหาแบบฟอร์มแรกและส่งอย่างไรก็ตามมันจะทำงานได้อย่างสมบูรณ์แบบหากมีเพียงหนึ่งรูปแบบในแต่ละครั้ง
Chintan Thummar

22

สำหรับข้อมูล
ถ้าใครใช้

$('#formId').submit();

อย่าทำอะไรแบบนี้

<button name = "submit">

ใช้เวลาหลายชั่วโมงกว่าจะพบฉันว่า submit () ไม่ทำงานเช่นนี้


1
การสะกดผิดด้วยคำสำคัญ"sumit"ทำให้ไม่ชัดเจนหากพิมพ์ผิดโดยไม่ตั้งใจหรือมีความเกี่ยวข้องกับปัญหา คุณหมายความว่าปุ่มชื่อ"submit"messes up jquery form submit () ใช่ไหม หรือคุณหมายถึงปัญหาคือคุณให้ชื่อปุ่มส่งแทนมาตรฐานtype="submit"หรือไม่
Daryn

ความตั้งใจของฉันไม่ได้ตอบคำถามนี้ แต่บอกผู้ที่ประสบปัญหานี้ ฉันคิดว่าปัญหาเกิดขึ้นกับชื่อปุ่มที่ไม่มีการกำหนดประเภทเพราะฉันใช้เหตุการณ์ onclick เพื่อตรวจสอบอินพุตก่อนส่ง ถ้า type = submit จากนั้นส่งแบบฟอร์มโดยไม่มีไฟของฉัน onclick
AZ Soft

16

ใช้มันเพื่อส่งแบบฟอร์มของคุณโดยใช้ jquery นี่คือลิงค์http://api.jquery.com/submit/

<form id="form" method="post" action="#">
    <input type="text" id="input">
    <input type="button" id="button" value="Submit">
</form>

<script type="text/javascript">
$(document).ready(function () {
    $( "#button" ).click(function() {
        $( "#form" ).submit();
    });
});
</script>

2
แม้ว่านี่จะเป็นการโพสต์เก่า แต่ก็คุ้มค่าที่จะเพิ่มประเภทbuttonลงในปุ่มของคุณเพื่อให้แน่ใจว่าแบบฟอร์มจะไม่ส่ง (เนื่องจากเบราว์เซอร์บางตัวจะไม่ใช้ปุ่มที่ไม่มีประเภทเหมือนกัน)
Mikey

@ Mikey ขอบคุณสำหรับคำแนะนำ
Chintan Thummar

14

สิ่งนี้จะส่งแบบฟอร์มที่มีตัวโหลดล่วงหน้า:

var a=$('#yourform').serialize();
$.ajax({
    type:'post',
    url:'receiver url',
    data:a,
    beforeSend:function(){
        launchpreloader();
    },
    complete:function(){
        stopPreloader();
    },
    success:function(result){
         alert(result);
    }
});

ฉันมีเคล็ดลับบางประการในการสร้างแบบฟอร์มการโพสต์ข้อมูลด้วยวิธีการสุ่มhttp://www.jackart4.com/article.html


คุณสามารถโพสต์ลิงค์ที่อัพเดทแล้วได้ไหม? ลิงก์ด้านบนใช้งานไม่ได้อีกต่อไป
Chris22


12

โปรดทราบว่าถ้าคุณติดตั้งฟังเหตุการณ์ส่งสำหรับแบบฟอร์มของคุณโทร Innner เพื่อส่ง ()

jQuery('#<form-id>').submit( function(e){ 
    e.preventDefault();
    // maybe some validation in here
    if ( <form-is-valid> ) jQuery('#<form-id>').submit();
});

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

    jQuery('#<form-id>').submit( function(e){ 
      e.preventDefault();
      // note the [0] array access:
      if ( <form-is-valid> ) jQuery('#<form-id>')[0].submit();
    });



7

โปรดทราบว่าใน Internet Explorer มีปัญหากับฟอร์มที่สร้างขึ้นแบบไดนามิก แบบฟอร์มที่สร้างขึ้นเช่นนี้จะไม่ส่งใน IE (9):

var form = $('<form method="post" action="/test/Delete/">' +
             '<input type="hidden" name="id" value="' + myid + '"></form>');
$(form).submit();

เพื่อให้มันทำงานใน IE สร้างองค์ประกอบแบบฟอร์มและแนบก่อนที่จะส่งเช่น:

var form = document.createElement("form");
$(form).attr("action", "/test/Delete")
       .attr("method", "post");
$(form).html('<input type="hidden" name="id" value="' + myid + '" />');
document.body.appendChild(form);
$(form).submit();
document.body.removeChild(form);

การสร้างแบบฟอร์มในตัวอย่างที่ 1 จากนั้นการเชื่อมต่อจะไม่ทำงาน - ใน IE9 จะเกิดข้อผิดพลาด JScript DOM Exception: HIERARCHY_REQUEST_ERR (3)

อุปกรณ์ประกอบฉากเพื่อ Tommy W @ https://stackoverflow.com/a/6694054/694325


7

การแก้ไขปัญหาที่ทำให้คุณต้องรู้ ID ของแบบฟอร์ม

ใช้รหัสนี้เพื่อส่งแบบฟอร์มโดยไม่จำเป็นต้องทราบ ID:

function handleForm(field) {
    $(field).closest("form").submit();
}

ตัวอย่างเช่นหากคุณต้องการจัดการเหตุการณ์คลิกสำหรับปุ่มคุณสามารถใช้

$("#buttonID").click(function() {
    handleForm(this);    
});

6

หากปุ่มอยู่ระหว่างแท็กแบบฟอร์มฉันชอบเวอร์ชั่นนี้:

$('.my-button').click(function (event) {
    var $target = $( event.target );
    $target.closest("form").submit();
});



3

แนวทางของฉันแตกต่างกันเล็กน้อยเปลี่ยนปุ่มเป็นปุ่มส่งแล้วคลิก

$("#submit").click(function(event) {
$(this).attr('type','submit');
$(this).click();
});

2
function  form_submit(form_id,filename){
    $.post(filename,$("#"+form_id).serialize(), function(data){
        alert(data);
    });
}

มันจะโพสต์ข้อมูลแบบฟอร์มในชื่อไฟล์ที่คุณกำหนดผ่าน AJAX


1

ฉันแนะนำโซลูชันทั่วไปดังนั้นคุณไม่จำเป็นต้องเพิ่มรหัสสำหรับทุกรูปแบบ ใช้ปลั๊กอินแบบฟอร์ม jquery (http://jquery.malsup.com/form/) และเพิ่มรหัสนี้

$(function(){
$('form.ajax_submit').submit(function() {
    $(this).ajaxSubmit();
            //validation and other stuff
        return false; 
});

});


-2

ฉันได้ใช้สิ่งต่อไปนี้เพื่อส่งแบบฟอร์ม (โดยไม่ส่งจริง ๆ ) ผ่าน Ajax:

  jQuery.get("process_form.php"+$("#form_id").serialize(), {}, 
    function() {
      alert("Okay!"); 
    });

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