2012-01-11 16 views
13

सबमिट करने से किसी फ़ॉर्म को देरी कैसे कर सकता हूं मेरे पास फॉर्म सबमिट करने से पहले निष्पादित करने के लिए मेरे पास एक अतिरिक्त फ़ंक्शन है। यह चाल नहीं कर रहा है।मैं

$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     $(this).submit(); 
    }, 300); 

}); 

यह स्पष्ट रूप से काम नहीं कर रहा है।

उत्तर

28

आपको फ़ॉर्म तत्व पर ही ईवेंट को आग लगाना होगा, jQuery चयन पर नहीं। (वास्तव में, आप भी ऐसा फ़ॉर्म तत्व का चयन नहीं किया गया - setTimeout अंदर, this वैश्विक वस्तु है।)

कैश प्रपत्र (this) के लिए एक संदर्भ और फोन अपने submit विधि:

$('form').submit(function(event) { 
    var formId = this.id, 
     form = this; 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     form.submit(); 
    }, 300); 
}); 

ध्यान दें कि मैंने this.id के साथ अपने अक्षम $(this).attr('id') कॉल को भी बदल दिया है। ध्यान दें कि आपको डीओएम फॉर्म एलिमेंट की सबमिट विधि को कॉल करना है, न कि jQuery विधि, ताकि jQuery इवेंट हैंडलर ट्रिगर न हो, जो एक अनंत (और पूरी तरह से अप्रभावी) लूप का कारण बनता है।

+0

मैं प्रस्तुत देरी करने के लिए मैंने कोशिश की है, लेकिन फायरबग कहता है form.submit() एक समारोह नहीं है। मैं jQuery 1.7.1 का उपयोग कर रहा हूँ। – Chris

+0

@Chris आपने मेरे उत्तर में सही कोड का उपयोग किया है? – lonesomeday

+0

हां, मैं इसे JSFiddle में काम करने के लिए प्राप्त कर सकता हूं, लेकिन मेरे पृष्ठ पर नहीं। मैं गतिशील रूप से jQuery लोड कर रहा हूं, इसलिए यह उससे संबंधित हो सकता है। hrmm – Chris

1
$('form').submit(function(event) { 
    var formId = this.id, 
       $this = $(this); 

    mySpecialFunction(formId); 

    event.preventDefault(); 
    $this.unbind("submit"); 
    setTimeout($.proxy($.fn.submit, $this), 300); 

}); 
1

सबमिट ईवेंट को अनइंड करने का प्रयास करें, और सेटटाइमआउट के भीतर विंडो के बजाय उचित "यह" देखें।

$(this).unbind("submit"); 
var self = this; 
setTimeout(function() { 
    $(self).submit(); 
}, 300); 
0

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

1

आप अपने समारोह में एक कॉलबैक सेट कर सकते हैं

$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 

    mySpecialFunction(formId, $(this).doWhatever(formId); 

    event.preventDefault(); 
}); 

function mySpecialFunction(id, onComplete) { 

    if ($.isFunction(onComplete)) { 
     onComplete.call(this); 
    } 
} 
0
jQuery देरी विधि के साथ

भी संभव:

$(function() { 
    $('#the_form').delay(300).submit(); 
}); 
0

एक और छोटा सा कोड फार्म के रूप में इस प्रकार है

$('form').submit(function (e) { 
    var form = this; 
    e.preventDefault(); 
    setTimeout(function() { 
     form.submit(); 
    }, 1000); // in milliseconds 

    $("<p>Delay...</p>").appendTo("body"); 
});