2012-01-30 15 views
11

मैं वर्तमान में एक फॉर्म जमा करने के लिए jquery का उपयोग कर रहा हूं और उपयोगकर्ताओं को पुष्टि के लिए एक संवाद दिखा रहा हूं। यदि उपयोगकर्ता हां क्लिक करता है, तो फॉर्म जमा करना चाहिए। यदि उपयोगकर्ता नहीं क्लिक करता है, तो संवाद बंद करें।Jquery trap form submit()

यह सब ठीक काम करता है लेकिन एक मुद्दे के लिए: जब उपयोगकर्ता हाँ पर क्लिक करता है, तो यह फिर से उसी कोड को ट्रिगर करता है, और संवाद फिर से खोला जाता है।

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

मुझे समझ में क्यों यह हो रहा है, बस सबसे अच्छा तरीका यह चारों ओर पाने के लिए पर यकीन नहीं। मुझे एहसास है कि मैं फॉर्म सबमिट करने के बजाय बटन क्लिक पर मोडल दिखा सकता हूं, लेकिन फॉर्म सबमिट करने के लिए कीबोर्ड पर एंटर बटन मारने वाले उपयोगकर्ता की समस्या के आसपास यह समस्या नहीं आती है।

+0

बहुत रोचक! मुझे नहीं लगता कि इसके चारों ओर एक स्पष्ट तरीका है, हालांकि मुझे उम्मीद है कि कोई मुझे गलत साबित कर सकता है! क्या आपने 'preventDefault()' कार्यक्षमता को एकीकृत करने का प्रयास किया है? –

उत्तर

12

क्योंकि आप submit फार्म, submit घटना फिर से और इतने ईवेंट हैंडलर से चलाता है जब। उपयोगकर्ता OK कहता है कि आपको unbindsubmit ईवेंट हैंडलर की आवश्यकता है। इस

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        //Check this line - unbinding the submit event handler 
        $("#myform").unbind('submit').submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 
+0

बहुत बढ़िया, समाधान के लिए धन्यवाद। मैंने आज कुछ नया सीखा - अनबिंड() विधि! – JonoB

+0

एफवाईआई जब उपयोगकर्ता 'ओके' पर क्लिक करता है तो यह फॉर्म सबमिट करने की तुलना में एक अलग घटना है, इसलिए झूठी वापसी वास्तव में हैंडलर में 'ओके' बटन के लिए महत्वपूर्ण नहीं है। –

+0

@MelStanley - Yup ने इसे बाद में महसूस किया लेकिन धन्यवाद। उत्तर से उस भाग को हटा दिया। – ShankarSangoli

5

आप रिटर्न फाल्स चाहिए जब OK:

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return false; // <=== not just return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

या मैन्युअल हटाना सबमिट करें:

buttons: { 
"OK": function() { 
    $dialog.dialog('close'); 
    //$("#myform").submit(); <-- delete it 
    return; 
}, 
0

मैं तो जैसे कुछ छिपा इनपुट से something या तो एक namespaced वैश्विक, या एक मूल्य होगा प्रयास करें:

var something = nameSpaced.something || $('#hiddenInput').val(); //your choice 
if (something) { 
    ... 
} ... 

आपका तर्क सामान्य रूप से तो काम करना चाहिए।

0

फ़ॉर्म सबमिट करने के लिए jQuery ऑब्जेक्ट का उपयोग करने का इरादा, आप डीओएम तत्व का उपयोग कर सकते हैं कि jQuery ऑब्जेक्ट फॉर्म को सबमिट करने के लिए संदर्भित करता है। यह jQuery घटना हैंडलर को छोड़ देता है। आपका ठीक फ़ंक्शन इस तरह दिखेगा:

"OK": function() { 
    $dialog.dialog('close'); 
    $("#myform").get(0).submit(); // use the underlying DOM element to sumbit 
    return false; 
}, 
संबंधित मुद्दे