जावास्क्रिप्ट में एक फ़ॉर्म सबमिट करें और सामान्य सबमिशन को रोकें


84

जावास्क्रिप्ट का उपयोग करके फ़ॉर्म सबमिट करने के तरीके के बारे में बहुत सारी जानकारी प्रतीत होती है, लेकिन जब कोई फ़ॉर्म सबमिट किया गया है, तो उसे कैप्चर करने के लिए मैं एक समाधान ढूंढ रहा हूँ और इसे जावास्क्रिप्ट में इंटरसेप्ट करता हूँ।

एचटीएमएल

<form>
 <input type="text" name="in" value="some data" />
 <button type="submit">Go</button>
</form>

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

function captureForm() {
 // do some stuff with the values in the form
 // stop form from being submitted
}

एक त्वरित हैक बटन पर एक ऑनक्लिक फ़ंक्शन जोड़ने के लिए होगा, लेकिन मुझे यह समाधान पसंद नहीं है ... एक फॉर्म सबमिट करने के कई तरीके हैं ... जैसे इनपुट पर रिटर्न दबाते हुए, जिसके लिए यह खाता नहीं है।

स्व-परीक्षा


जवाबों:


96
<form id="my-form">
    <input type="text" name="in" value="some data" />
    <button type="submit">Go</button>
</form>

जेएस में:

function processForm(e) {
    if (e.preventDefault) e.preventDefault();

    /* do what you want with the form */

    // You must return false to prevent the default form behavior
    return false;
}

var form = document.getElementById('my-form');
if (form.attachEvent) {
    form.attachEvent("submit", processForm);
} else {
    form.addEventListener("submit", processForm);
}

संपादित करें : मेरी राय में, यह दृष्टिकोण onSubmitफॉर्म पर विशेषता स्थापित करने से बेहतर है क्योंकि यह मार्क-अप और कार्यक्षमता को अलग करता है। लेकिन वह सिर्फ मेरे दो सेंट है।

Edit2 : मेरे उदाहरण को शामिल करने के लिए अपडेट किया गयाpreventDefault()


यह क्रोम के साथ काम नहीं करता है जहाँ तक मैं jsbin.com/ejoyas
Eiyrioü von Kauyf

2
ध्यान दें कि अनुलग्नक में कोड उपलब्ध होने पर ईवेंट कोड को निष्पादित करने की आवश्यकता होती है। उदाहरण के लिए window.onload=function() { ... }इसे लपेटने के लिए
mplungjan

processform()समारोह को साहब कब कहा जाता है?

यकीन नहीं है क्योंकि मैं IE का उपयोग नहीं करता हूं, लेकिन मुझे लगता है कि अटैचमेंट पैरामीटर "ऑन्सबमिट" होना चाहिए।
जेरार्ड ओनली

यह क्रोम 46 में काम नहीं करता है, एक घटना को संलग्न करने में त्रुटि, पृष्ठ को पहले लोड करने की आवश्यकता है
tsukimi

29

आपके द्वारा लोड किए गए तत्वों को संलग्न करने से पहले आप घटनाओं को संलग्न नहीं कर सकते

यह काम -

सादा जेएस

डेमो

EventListener का उपयोग करने के लिए अनुशंसित

// Should only be triggered on first page load
console.log('ho');

window.addEventListener("load", function() {
  document.getElementById('my-form').addEventListener("submit", function(e) {
    e.preventDefault(); // before the code
    /* do what you want with the form */

    // Should be triggered on form submit
    console.log('hi');
  })
});
<form id="my-form">
  <input type="text" name="in" value="some data" />
  <button type="submit">Go</button>
</form>

लेकिन अगर आपको एक से अधिक श्रोता की आवश्यकता नहीं है, तो आप ऑनलोड और ऑनसुबमिट का उपयोग कर सकते हैं

// Should only be triggered on first page load
console.log('ho');

window.onload = function() {
  document.getElementById('my-form').onsubmit = function() {
    /* do what you want with the form */

    // Should be triggered on form submit
    console.log('hi');
    // You must return false to prevent the default form behavior
    return false;
  }
}
    <form id="my-form">
      <input type="text" name="in" value="some data" />
      <button type="submit">Go</button>
    </form>

jQuery

// Should only be triggered on first page load
console.log('ho');

$(function() {
  $('#my-form').on("submit", function(e) {
    e.preventDefault(); // cancel the actual submit

    /* do what you want with the form */

    // Should be triggered on form submit

    console.log('hi');
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="my-form">
  <input type="text" name="in" value="some data" />
  <button type="submit">Go</button>
</form>


मुझे लगता है कि आपका मतलब है: $ ('# मेरा-फ़ॉर्म) .on (' सबमिट ', फंक्शन () {अलर्ट (' हाय ');});
मिकिएल

1
@Michiel जब आप प्रदान करते हैं जो आप jQuery के साथ उपयोग करते हैं, तो प्रदान किया गया यह समाधान शुद्ध JS समाधान है जो jQuery पर निर्भरता के साथ नहीं है। यहाँ समाधान का उपयोग करने के लिए समान होगा<form onsubmit="alert('hi'); return false;">
क्रिस मैरिक जूल

2
@ChrisMarisic - कुछ साल पुराना :) मैंने वैसे भी जवाब दिया है कि इसमें jQuery शामिल है
mplungjan

17

<form onSubmit="return captureForm()"> वह करना चाहिए। सुनिश्चित करें कि आपकी captureForm()विधि वापस आती है false


अनुवर्ती करें: क्या आवश्यक विशेषता के ब्राउज़र की हैंडलिंग को प्रभावित किए बिना जावास्क्रिप्ट के साथ फ़ॉर्म सबमिट करने का एक तरीका है?
एलिजाबेथ

@ इलीशिबा किस विशेषता से निपटती है? यदि आप फॉर्म को वास्तव में प्रस्तुत किए जाने से नहीं रोकते हैं, तो आपको इसके बजाय captureForm()वापस लौटने की आवश्यकता है । truefalse
23

"आवश्यक" विशेषता के ब्राउज़र की हैंडलिंग। मैं फ़ॉर्म को सबमिट होने से रोकना चाहता हूं। लेकिन सही के बजाय झूठे लौटने से (या preventDefault () का उपयोग करके), यह बदल जाता है कि ब्राउज़र इनपुट तत्व पर "आवश्यक" विशेषता को कैसे संभालता है। इसे अपने लिए आज़माएं: इनपुट तत्व में <code> आवश्यक </ code> जोड़ें, सबमिट करें और देखें कि क्या आप इसके लिए डिफ़ॉल्ट व्यवहार खो देते हैं।
एलिजाबेथ

मुझे डिफ़ॉल्ट व्यवहार नहीं लगता है। यह क्रोम में ठीक काम करता है। आपको मेरी मदद करने के लिए एक गलत उदाहरण के साथ आने की आवश्यकता होगी।
kba

1
ठीक है, यहाँ फ़ॉर्म है: <form method = "get" action = "> <लेबल for =" color "> आपका पसंदीदा रंग क्या है? </ लेबल> <इनपुट प्रकार =" पाठ "नाम =" रंग "प्लेसहोल्डर = "नीला" आवश्यक> <इनपुट आईडी = "सबमिट करें" प्रकार = "सबमिट करें" मूल्य = "सबमिट करें> </ फार्म> और यहां कोड है: फ़ंक्शन प्रक्रियाफ़ॉर्म (ई) {var form = document.querySelector (" फ़ॉर्म "); के लिए (var i = 0; मैं <form.childNodes.length; i ++) {var नोड = form.childNodes [i]; / * नोड्स के साथ सामान करते हैं /} / झूठी वापसी; * /} ओपेरा में परीक्षण। अंतिम पंक्ति को रद्द करें, आवश्यक विफल रहता है। (क्षमा करें कोड टिप्पणियों में अच्छी तरह से काम नहीं करता है)
एलिजाबेथ

6

उन सभी अनुरोधों को संभालने के लिए एक अन्य विकल्प जो मैंने अपने व्यवहार में उन मामलों के लिए उपयोग किए हैं जब ओनोलोड मदद नहीं कर सकता है जावास्क्रिप्ट सबमिट, एचटीएमएल सबमिट, अजाक्स अनुरोध। किसी भी रूप को प्रस्तुत करने और प्रस्तुत करने से पहले श्रोता बनाने के लिए इन कोड को शरीर तत्व के शीर्ष में जोड़ा जाना चाहिए।

उदाहरण में, मैंने पृष्ठ पर किसी भी रूप में इसके जमा होने पर छिपे हुए क्षेत्र को सेट किया, भले ही यह पृष्ठ लोड से पहले हो।

//Handles jquery, dojo, etc. ajax requests
(function (send) {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    XMLHttpRequest.prototype.send = function (data) {
        if (isNotEmptyString(token) && isNotEmptyString(header)) {
            this.setRequestHeader(header, token);
        }
        send.call(this, data);
    };
})(XMLHttpRequest.prototype.send);


//Handles javascript submit
(function (submit) {
    HTMLFormElement.prototype.submit = function (data) {
        var token = $("meta[name='_csrf']").attr("content");
        var paramName = $("meta[name='_csrf_parameterName']").attr("content");
        $('<input>').attr({
            type: 'hidden',
            name: paramName,
            value: token
        }).appendTo(this);

        submit.call(this, data);
    };
})(HTMLFormElement.prototype.submit);


//Handles html submit
document.body.addEventListener('submit', function (event) {
    var token = $("meta[name='_csrf']").attr("content");
    var paramName = $("meta[name='_csrf_parameterName']").attr("content");
    $('<input>').attr({
        type: 'hidden',
        name: paramName,
        value: token
    }).appendTo(event.target);
}, false);

2

@Kristian Antonsen के उत्तर का उपयोग करें, या आप उपयोग कर सकते हैं:

$('button').click(function() {
    preventDefault();
    captureForm();
});

4
किसी और के लिए यह 2.5 साल (या अधिक) बाद में कर रहा है, आपको फ़ंक्शन के पैरामीटर के रूप में क्लिक इवेंट को पास करने की आवश्यकता है (जैसा कि function(e)और कॉल करेंe.preventDefault()
digitaljoel

फॉर्म के लिए "सबमिट" ईवेंट पर भी कब्जा किया जा सकता है, यदि आपका इनपुट [टाइप = "सबमिट"] का उपयोग किया जाता है, और जो आपको फॉर्म के संदर्भ बनाम बटन के संदर्भ में डालता है। कॉलबैक में हमेशा घटना का संदर्भ होगा, इसलिए आपको तर्क के रूप में 'ई' पास करना आवश्यक नहीं है, आप बस 'ईवेंट' का संदर्भ देते हैं।
१०'१५ को १४:३४

1
यह अनुशंसित नहीं है, क्योंकि सबमिशन को एक कुंजीपट के रूप में शुरू किया जा सकता है।
jhpratt 6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.