बिना पुनर्निर्देशन के HTML फॉर्म कैसे जमा करें


95

अगर मेरे पास ऐसा कोई फॉर्म है,

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm"> ... </form>

मैं इसे जावास्क्रिप्ट / jQuery द्वारा किसी अन्य दृश्य पर पुनर्निर्देशित किए बिना कैसे सबमिट कर सकता हूं?

मैंने स्टैक ओवरफ्लो से बहुत सारे उत्तर पढ़े, लेकिन उनमें से सभी ने मुझे POST फ़ंक्शन द्वारा दिए गए दृश्य पर पुनर्निर्देशित किया।


आप एक XHR अनुरोध (AJAX) चाहते हैं
स्टर्लिंग आर्चर

2
XHR / AJAX एक तरीका है - यह पोस्ट को सबमिट करता है और पर्दे के पीछे की प्रतिक्रिया प्राप्त करता है, इसलिए ब्राउज़र उस पृष्ठ को कभी नहीं छोड़ता है। दूसरा तरीका पोस्ट को संसाधित करने के बाद एक सर्वर-साइड रीडायरेक्ट है, जो इस बात पर निर्भर करता है कि आप किस सर्वर तकनीक का उपयोग कर रहे हैं।
स्टीफन पी।

@StephenP मैं ASP.NET MVC 5.1 का उपयोग करता हूं।
ड्यूक न्यूक

@ ड्यूक, मैं कह रहा हूं कि एक से अधिक दृष्टिकोण (ajax बनाम सर्वर-रीडायरेक्ट) है और आपकी पसंद आपकी आवश्यकताओं पर निर्भर करती है। आधुनिक साइटें सबसे अधिक अजाक्स करना चाहेंगी। यह भी ध्यान रखें कि इन सभी सवालों के जवाब कह रहे हैं आप की जरूरत है jQuery के महान लेकिन वहाँ - jQuery हैं वास्तव में, अन्य तरीकों ajax करने के लिए ... हालांकि मैं वास्तव में jQuery अपने आप का प्रयोग करेंगे।
स्टीफन पी।

1
मेरा रास्ता सरल स्वच्छ और सुरुचिपूर्ण है, और यह कोड की केवल 2 लाइनें हैं। यह स्क्रिप्ट का उपयोग नहीं करता है, और जावास्क्रिप्ट बंद होने पर भी HTML4 और इसके बाद के संस्करण में काम करता है।
इस्सा चान्जी

जवाबों:


74

आप जो चाहते हैं उसे प्राप्त करने के लिए, आपको नीचे दिए गए jQuery Ajax का उपयोग करना होगा :

$('#myForm').submit(function(e){
    e.preventDefault();
    $.ajax({
        url: '/Car/Edit/17/',
        type: 'post',
        data:$('#myForm').serialize(),
        success:function(){
            // Whatever you want to do after the form is successfully submitted
        }
    });
});

यह भी एक कोशिश:

function SubForm(e){
    e.preventDefault();
    var url = $(this).closest('form').attr('action'),
    data = $(this).closest('form').serialize();
    $.ajax({
        url: url,
        type: 'post',
        data: data,
        success: function(){
           // Whatever you want to do after the form is successfully submitted
       }
   });
}

अंतिम समाधान

यह त्रुटिपूर्ण काम किया। मैं इस फ़ंक्शन को कॉल करता हूंHtml.ActionLink(...)

function SubForm (){
    $.ajax({
        url: '/Person/Edit/@Model.Id/',
        type: 'post',
        data: $('#myForm').serialize(),
        success: function(){
            alert("worked");
        }
    });
}

यह बड़ी समस्या है कि मैं नहीं चाहता कि यह स्वचालित रूप से (हमेशा) इस तरह से डूबे रहे। मैं आपके उत्तर में आपके द्वारा पोस्ट किए गए सामान को करने के लिए एक नाम के साथ एक फ़ंक्शन करना चाहूंगा। इसलिए मैं इसे मैन्युअल रूप से लागू कर सकता हूं जब मैं चाहता हूं, इसे फॉर्म पोस्ट करने के लिए। नीचे की तरह मैं फंक्शन का नाम दे सकता हूं। @Html.ActionLink("Add a Report", "Create", "Reports", new { carId = Model.Id }, new { onclick = "FUNCTION_WHICH_SUBMITES_FORM()" })
ड्यूक न्यूक

इसने काम किया:function SubForm (){ alert("1"); //e.preventDefault(); $.ajax({ url:'/Car/Edit/@Model.Id/', type:'post', data:$('#myForm').serialize(), success:function(){ alert("fasf"); } }); }
ड्यूक न्यूक

किसी कारण से आपका दूसरा समाधान काम नहीं आया, लेकिन जो मैंने पिछली टिप्पणी में पोस्ट किया था। मैं आपके पोस्ट कारण के लिए अपना समाधान जोड़ूंगा क्योंकि आप इसे प्राप्त कर सकते हैं।
ड्यूक न्यूक

1
दूसरे को भी काम करना चाहिए, इसके लिए कुछ और भी हो सकता है, लेकिन अगर आपको इसका समाधान मिल गया तो हमें उस सड़क पर जाने की जरूरत नहीं है! खुशी हुई कि इससे मदद मिली;)
अमीन जाफरी

धन्यवाद इस जवाब ने मुझे फॉर्म के स्थान पर एक कस्टम टेक्स्ट डालने में भी मदद की
अनुपम

116

आप actionकिसी अदृश्य के लिए प्रपत्र को पुनर्निर्देशित करके प्राप्त कर सकते हैं <iframe>। इसके लिए किसी जावास्क्रिप्ट या किसी अन्य प्रकार की स्क्रिप्ट की आवश्यकता नहीं है।

<iframe name="dummyframe" id="dummyframe" style="display: none;"></iframe>

<form action="submitscript.php" target="dummyframe">
    <!-- Form body here -->
</form>

1
यह भी खूब रही। लेकिन फॉर्म जमा होने के बाद मैं कुछ कैसे कर सकता हूं? यानी फॉर्म की पाठ्य-सामग्री को खाली करना होगा, फ़ोकस पहले फ़ील्ड पर वापस जाता है, आदि?
प्रांजल चोलधारा 21

1
कुछ प्रकार के जावास्क्रिप्ट जो ऐसा कर सकते हैं। बस बदलने <input type='submit'...के लिए <input type='reset'और जोड़नेonclick='document.forms["myForm"].submit();'>
Issa Chanzi

सुंदर जवाब! महान काम करता है
Cybrus

सावधान रहें, आपके द्वारा iframe में जिस रूप में है, उस पृष्ठ को फिर से लोड करने की संभावना है, जिससे यदि आप किसी ऐप या बड़ी वेबसाइट का निर्माण कर रहे हैं तो प्रदर्शन में परेशानी हो सकती है।
अलेक्जेंड्रे डेबोरकोर्ट

22

iFrameअपने पृष्ठ के निचले भाग में और targetअपने रूप में छिपा हुआ रखें :

<iframe name="hiddenFrame" width="0" height="0" border="0" style="display: none;"></iframe>

<form action="/Car/Edit/17" id="myForm" method="post" name="myForm" target="hiddenFrame"> ... </form>

जल्द और आसान। ध्यान रखें कि जबकिtarget विशेषता अभी भी व्यापक रूप से समर्थित है (और HTML5 में समर्थित है), इसे HTML 4.01 में पदावनत किया गया था।

तो आप वास्तव में भविष्य के सबूत के लिए अजाक्स का उपयोग करना चाहिए।


MDN के अनुसार, यह व्यवहार targetपूरी तरह से मान्य है, इसलिए AJAX अभी भी वैकल्पिक है।
डैनियल डे लियोन

18

चूँकि सभी वर्तमान उत्तर में jQuery या ट्रिक्स का उपयोग iframe के साथ किया गया है, यह पता लगाया गया है कि केवल सादे जावास्क्रिप्ट के साथ विधि जोड़ने का कोई नुकसान नहीं है:

function formSubmit(event) {
  var url = "/post/url/here";
  var request = new XMLHttpRequest();
  request.open('POST', url, true);
  request.onload = function() { // request successful
  // we can use server response to our request now
    console.log(request.responseText);
  };

  request.onerror = function() {
    // request failed
  };

  request.send(new FormData(event.target)); // create FormData from form that triggered event
  event.preventDefault();
}

// and you can attach form submit event like this for example
function attachFormSubmitEvent(formId){
  document.getElementById(formId).addEventListener("submit", formSubmit);
}

2
आपको बहुत - बहुत धन्यवाद!
जोशुआ इवांस

मैंने अपनी हैट तुम्हें टिप में दी है। मैंने घंटों बिताए यह जानने की कोशिश कर रहा है कि कंटेंट टाइप = झूठे पैरामीटर के साथ एक nginx बैकएंड में फॉर्म भेजने के लिए jquery कैसे प्राप्त करें और परिणाम के रूप में हमेशा 415 प्राप्त करें। यह एकमात्र समाधान था जो मैंने पाया कि मेरी विशेष समस्या हल हो गई।
user12066

7

ठीक है, मैं आपको इसे करने का एक जादुई तरीका बताने जा रहा हूं क्योंकि ऐसा नहीं है। यदि आपके पास प्रपत्र तत्व के लिए कोई क्रिया विशेषता सेट है, तो यह पुनर्निर्देशित होगा।

यदि आप यह नहीं चाहते हैं तो बस किसी भी कार्रवाई और सेट को पुनर्निर्देशित न करें onsubmit="someFunction();"

अपने someFunction()आप में आप जो चाहते हैं, (AJAX या नहीं के साथ) और अंत में, आप return false;ब्राउज़र को फ़ॉर्म जमा नहीं करने के लिए कहेंगे ...


1
इसे करने का एक जादुई तरीका है। एक लक्ष्य विशेषता सेट करें ताकि प्रपत्र वर्तमान फ़्रेम के अलावा कहीं और पुनर्निर्देशित हो। यदि आप अपने पन्नों में इस तरह की चीजों के लिए एक अदृश्य iframe जोड़ते हैं। यह बहुत आसान है।
इस्सा चान्झी

5

ऐसा करने के लिए आपको अजाक्स की आवश्यकता है। कुछ इस तरह:

$(document).ready(function(){
    $("#myform").on('submit', function(){
        var name = $("#name").val();
        var email = $("#email").val();
        var password = $("#password").val();
        var contact = $("#contact").val();

        var dataString = 'name1=' + name + '&email1=' + email + '&password1=' + password + '&contact1=' + contact;
        if(name=='' || email=='' || password=='' || contact=='')
        {
            alert("Please fill in all fields");
        }
        else
        {
            // Ajax code to submit form.
            $.ajax({
                type: "POST",
                url: "ajaxsubmit.php",
                data: dataString,
                cache: false,
                success: function(result){
                    alert(result);
                }
           });
        }
        return false;
    });
});

5
क्या कोई विशेष कारण है कि आप इस स्रोत कोड को इंडेंट नहीं करते हैं? ऐसा लगता है कि सी का आविष्कार होने से पहले साठ के दशक से कोड था। मुझे लगा कि हम इस पर लंबे समय से थे।
अल्फ

2

देखें jQuery का postफ़ंक्शन।

मैं एक बटन बनाने होता है, और एक सेट onClickListener($('#button').on('click', function(){}); ) फ़ंक्शन में डेटा भेजता ।

इसके अलावा, preventDefaultफ़ंक्शन देखें , jQuery का!


2

2020 तक वन-लाइनर समाधान, यदि आपका डेटा के रूप में multipart/form-dataया भेजने के लिए नहीं है application/x-www-form-urlencoded:

<form onsubmit='return false'>
    <!-- ... -->           
</form>

3
यदि आप इसे ओपी के साथ जोड़ते हैं action="...", तो यह प्रभावी रूप से पृष्ठ स्विच को रोकता है, लेकिन नेटवर्क भर में प्रस्तुत किए जा रहे डेटा को भी रोकता है।
केव

@ क्या मैं व्यक्तिगत रूप से जेएस एक्सएचआर के माध्यम से अपना डेटा भेजता हूं, इसीलिए मुझे पेज पुनर्निर्देशन नहीं चाहिए, क्योंकि यह जेएस ऐप है
अलेक्जेंड्रे डब्युटकोर्ट

@ केव सॉरी मुझे इस बात का उल्लेख करना चाहिए था कि
एलेक्जेंडर डेब्रॉकोर्ट

1

यहां दिए गए फ़ॉर्म के बाहर सबमिट बटन को स्थानांतरित करके वांछित प्रभाव भी प्राप्त किया जा सकता है:

पेज पुनः लोड होने से रोके और फॉर्म पर रीडायरेक्ट करें ajax / jquery सबमिट करें

ऐशे ही:

<form id="getPatientsForm">
    Enter URL for patient server
    <br/><br/>
    <input name="forwardToUrl" type="hidden" value="/WEB-INF/jsp/patient/patientList.jsp" />
    <input name="patientRootUrl" size="100"></input>
    <br/><br/>
</form>

<button onclick="javascript:postGetPatientsForm();">Connect to Server</button>

1

इस स्निपेट का उपयोग करके, आप फ़ॉर्म सबमिट कर सकते हैं और पुनर्निर्देशन से बच सकते हैं। इसके बजाय आप सफलता समारोह को तर्क के रूप में पारित कर सकते हैं और जो चाहें कर सकते हैं।

function submitForm(form, successFn){
    if (form.getAttribute("id") != '' || form.getAttribute("id") != null){
        var id = form.getAttribute("id");
    } else {
        console.log("Form id attribute was not set; the form cannot be serialized");
    }

    $.ajax({
        type: form.method,
        url: form.action,
        data: $(id).serializeArray(),
        dataType: "json",
        success: successFn,
        //error: errorFn(data)
    });
}

और फिर बस करो:

var formElement = document.getElementById("yourForm");
submitForm(formElement, function() {
    console.log("Form submitted");
});

0

यदि आप बैक एंड को नियंत्रित करते हैं, तो response.redirectइसके बजाय कुछ का उपयोग करें response.send

आप इसके लिए कस्टम HTML पेज बना सकते हैं या आपके पास पहले से मौजूद किसी चीज़ को रीडायरेक्ट कर सकते हैं।

Express.js में:

const handler = (req, res) => {
  const { body } = req
  handleResponse(body)
  .then(data => {
    console.log(data)
    res.redirect('https://yoursite.com/ok.html')
  })
  .catch(err => {
    console.log(err)
    res.redirect('https://yoursite.com/err.html')
  })
}
...
app.post('/endpoint', handler)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.