2013-11-25 12 views
29

मेरे पास एक ऐसा फॉर्म है जिसे मैं jquery के माध्यम से कैप्चर कर रहा हूं और AJAX के माध्यम से भेज रहा हूं। मेरी समस्या यह है कि जब भी मैं पेज रीफ्रेश करता हूं तो फॉर्म एक बार से अधिक बार सबमिट करता है।jquery AJAX फ़ॉर्म दो बार सबमिट करता है

मैंने सबमिट बटन को अनबिंड करने का प्रयास किया है लेकिन फिर फॉर्म को सबमिट करने के बाद सामान्य रूप से पोस्ट किया जाता है। किसी भी मदद

$('#exportForm').submit(function() { 

    $.ajax({ 
    type: "POST", 
    url: $(this).attr('action'), 
    data: $(this).serialize(), 
    success: function(response) { 
     $('#exportForm').unbind('submit'); 
     console.log(response); 
    } 
    }); 

    return false; 
}); 
+1

जवाब मैं तुम्हें – cosset

+0

काफी सब वहाँ एक बहुत ही बुनियादी रूप के अलावा अन्य है अरे cosset, यही कारण है कि है अधिक कोड प्रदान की जरूरत है। आपको और क्या चाहिए? –

उत्तर

24

सराहना की जाएगी यह सबसे अधिक संभावना है कि आप ajax घटना को गति प्रदान करने के लिए एक button या submit का उपयोग कर रहे है। इसे आज़माएं:

$('#exportForm').submit(function(e){ 
     e.preventDefault(); 
     $.ajax({ 
      type: "POST", 
      url: $(this).attr('action'), 
      data: $(this).serialize(), 
      success: function(response) { 
       console.log(response); 
      } 
     }); 

     return false; 
    }); 
+0

धन्यवाद, मैंने '$ (' # exportForm ') हटा दिया है। Unbind (' submit ');' और 'e.preventDefault();' जोड़ा और ऐसा लगता है कि काम किया है। जब मैं कर सकता हूं मैं स्वीकार करूंगा। –

+0

दिलचस्प - आप कह रहे हैं कि 'वापसी झूठी' डिफ़ॉल्ट रूप से कार्रवाई सबमिट करने से रोकने के लिए काम नहीं करेगा? http://jsfiddle.net/rR8Xz/ –

+0

क्षमा करें, अधिक परीक्षण के बाद यह पता चला कि यह काम नहीं कर रहा है। –

75

साथ ही रोकथाम डीफॉल्ट को कॉल करना, ईवेंट पर स्टॉपइमीडिएटप्रॉपेशन को भी कॉल करें।

$('#exportForm').submit(function(e){ 
    e.preventDefault(); 
    e.stopImmediatePropagation(); 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr('action'), 
     data: $(this).serialize(), 
     success: function(response) { 
      console.log(response); 
     } 
    }); 

    return false; 
}); 
+7

जबकि आपका उत्तर प्रश्न हल कर सकता है, तो यह हमेशा बेहतर होता है कि आप अपना उत्तर कैसे हल करते हैं, इस बारे में विवरण प्रदान कर सकते हैं। इस मामले में, क्यों 'रोकें डीफॉल्ट' पर्याप्त नहीं है। यह और भविष्य के उत्तरों को और बेहतर बनाने के लिए यह एक सुझाव है। –

+7

e.stopImmediatePropagation() जोड़ना; मेरे लिए काम किया, क्रिस धन्यवाद! मैं इस शाम लगभग 2 घंटे के लिए इस पर अपने सिर खरोंच कर रहा हूँ। जबकि e.preventDefault() ने स्वयं के लिए मेरे लिए काम किया है, मुझे संदेह है क्योंकि यह सरल लिंक या बटन के लिए ठीक है लेकिन किसी फॉर्म के सबमिशन ईवेंट में काम करते समय, आपको ईवेंट को रोकने के लिए e.stopImmediatePropagation() का उपयोग करना होगा dom thorugh bubbugh से। Http://api.jquery.com/event.stopImmediatePropagation/ देखें। – Robini

+1

यह उत्तर है। – Andrew

8

मामले में आप सत्यापन के कुछ प्रकार (उदाहरण, jQuery मान्यकरण) का उपयोग कर रहे हैं, प्रपत्र दो बार प्रस्तुत किया जाता है क्योंकि $('#exportForm').submit से अलग आप अपने आप को लिखने, सत्यापन प्लगइन के बाद भी उसमें सफलतापूर्वक सभी क्षेत्र सत्यापित करता प्रपत्र प्रस्तुत करेगा।

एनबी: यदि आप jQuery सत्यापन का उपयोग कर रहे हैं, तो .submit() का उपयोग करने से बचें। इसके बजाय, submitHandler का उपयोग करें।

0

समस्या को आपके PHP फॉर्म पर एक बटन के स्थान पर div का उपयोग करके हल किया जा सकता है। AJAX के उपयोग के कारण एक बटन की आवश्यकता नहीं है।

0

जैसा कि क्रिस सेरकोबे ने बताया, e.stopImmediatePropagation() काम करता है और यह निश्चित रूप से समस्या को हल करता है, लेकिन आपको इसका उपयोग नहीं करना चाहिए। समस्या अभी भी आपके कोड में मौजूद है। मुझे दो उदाहरण अनुरोधों को कैसे भेजा जा सकता है इसका एक उदाहरण बताएं:

यदि आप एंगुलरजेएस का उपयोग कर रहे हैं, और कहें कि आप "हैंडलएजैक्स कंट्रोलर" नामक नियंत्रक बनाते हैं तो आप इस एनजी-नियंत्रक को एक div में असाइन कर सकते हैं, और फिर गलती से असाइन कर सकते हैं एक आंतरिक div के लिए यह वही एनजी नियंत्रक। इससे पोस्ट अनुरोध दो बार भेजा जाएगा। तो:

<div ng-controller='HandleAjaxController'> 
     <div ng-controller='HandleAjaxController'> 
      <button id="home" type="button" class="btn btn-success">Send data</button> 

यह एक समय मेरे लिए तनाव का एक बहुत का कारण बना क्योंकि मेरे एनजी-मार्ग में मैं यहाँ में नियंत्रक स्थापित किया था:

$routeProvider 
    .when("/", { 
     templateUrl : "src/js/partials/home.html", 
     controller : "HandleAjaxController" 
    }) 

और फिर मैं इसे फिर से सेट अपने घर में। एचटीएमएल: <div ng-controller='HandleAjaxController'>

वैसे भी, यह एक उदाहरण है कि दो पदों को कैसे भेजा जा सकता है।

संबंधित मुद्दे