2015-06-08 8 views
6

मैं Bootbox.js का उपयोग करके ऑन-द-फ्लाई पर एक फॉर्म के साथ एक संवाद बॉक्स लोड कर रहा हूं और मैं एक jQuery सत्यापन प्लगइन के साथ उपयोगकर्ता इनपुट को मान्य कर रहा हूं।jQuery। Validate() submitHandler फायरिंग नहीं

प्रमाणीकरण ठीक काम करता है, लेकिन submitHandler को सफलतापूर्वक भरने पर अनदेखा किया जाता है।

क्या गलत हो रहा है?

submitHandler: function(form) { 
    alert("Submitted!"); 
    var $form = $(form); 
    $form.submit(); 
} 

नीचे पूरा उदाहरण देखें। मैंने अन्य पदों पर ध्यान दिया है जहां एक समान मुद्दा उठाया गया है। दुर्भाग्य से वे पृष्ठ पर प्रस्तुत प्रपत्र प्रतीत होते हैं जबकि मैं jQuery के माध्यम से अपना प्रतिपादन कर रहा हूं।

$(document).on("click", "[data-toggle=\"contactAdmin\"]", function() { 
 
    bootbox.dialog({ 
 
    title: "Contact admin", 
 
    buttons: { 
 
     close: { 
 
     label: 'Close', 
 
     className: "btn btn-sm btn-danger", 
 
     callback: function() {} 
 
     }, 
 
     success: { 
 
     label: "Submit", 
 
     className: "btn btn-sm btn-primary", 
 
     callback: function() { 
 
      $("#webteamContactForm").validate({ 
 
      rules: { 
 
       requestType: { 
 
       required: true 
 
       } 
 
      }, 
 
      messages: { 
 
       requestType: { 
 
       required: "Please specify what your request is for", 
 
       } 
 
      }, 
 
      highlight: function(a) { 
 
       $(a).closest(".form-group").addClass("has-error"); 
 
      }, 
 
      unhighlight: function(a) { 
 
       $(a).closest(".form-group").removeClass("has-error"); 
 
      }, 
 
      errorElement: "span", 
 
      errorClass: "help-blocks", 
 
      errorPlacement: function(error, element) { 
 
       if (element.is(":radio")) { 
 
       error.appendTo(element.parents('.requestTypeGroup')); 
 
       } else { // This is the default behavior 
 
       error.insertAfter(element); 
 
       } 
 
      }, 
 
      submitHandler: function(form) { 
 
       alert("Submitted!"); 
 
       var $form = $(form); 
 
       $form.submit(); 
 
      } 
 
      }).form(); 
 
      return false; 
 
     } 
 
     } 
 
    }, 
 
    message: '<div class="row"> ' + 
 
     '<div class="col-md-12"> ' + 
 
     '<form id="webteamContactForm" class="form-horizontal" method="post"> ' + 
 
     '<p>Please get in touch if you wish to delete this content</p>' + 
 
     '<div class="form-group"> ' + 
 
     '<div class="col-md-12"> ' + 
 
     '<textarea id="message" name="message" class="form-control input-md" rows="3" cols="50">This email is to notify you the creator is putting a request for the following item\n\n' + 
 
     this.attributes.getNamedItem("data-url").value + '\n\n' + '</textarea> ' + 
 
     '<span class="help-block">Feel free to change the message and add more information. Please ensure you always provide the link.</span> </div> ' + 
 
     '</div> ' + 
 
     '<div class="form-group requestTypeGroup"> ' + 
 
     '<label class="col-md-4 control-label" for="requestType">This request is for:</label> ' + 
 
     '<div class="col-md-4"> <div class="radio"> <label for="Edit"> ' + 
 
     '<input type="radio" name="requestType" id="requestType-0" value="Edit"> ' + 
 
     'Editing </label> ' + 
 
     '</div><div class="radio"> <label for="Delete"> ' + 
 
     '<input type="radio" name="requestType" id="requestType-1" value="Delete"> Deletion</label> ' + 
 
     '</div> ' + 
 
     '</div> </div>' + 
 
     '</form> </div> </div>' 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.4.0/bootbox.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" /> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 
 
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.js"></script> 
 

 
<a data-toggle="contactAdmin" data-title="help" data-url="http:/www.mydomain.com/some-url" href="#">Contact Web team</a>

View on jsFiddle

उत्तर

14

jsFiddle और दो समस्याओं के डोम का निरीक्षण स्पष्ट हो।

  1. आपका "सबमिट करें" <button> एक type="button" है।

  2. आपका "सबमिट" बटन <form></form> कंटेनर के बाहर है।

आप jQuery मान्य प्लगइन स्वचालित रूप से "सबमिट करें" बटन के click घटना पर कब्जा करने के ...

  • बटन एक type="submit"
  • बटन के भीतर होना चाहिए होना चाहिए चाहते हैं <form></form> कंटेनर।

यदि आप प्लगइन को इरादे के अनुसार संचालित करना चाहते हैं तो इन दो स्थितियों को पूरा किया जाना चाहिए।


तुम भी गलत तरीके से रखा गया है अपने मॉडल संवाद बॉक्स के success कॉलबैक भीतर .validate() विधि बटन "सबमिट करें"।

.validate() विधि केवल आरंभ प्लगइन और एक बार के बाद प्रपत्र बनाई गई है बुलाया जाना चाहिए के लिए प्रयोग किया जाता है।


संपादित:

इस के साथ चारों ओर खेलने के बाद, यह स्पष्ट हो जाता Bootbox modal plugin कुछ महत्वपूर्ण सीमाओं कि प्रपत्र प्रस्तुत करने के साथ हस्तक्षेप हो सकता है।

  1. मैं मान्य प्लगइन के बाद संवाद खोला है आरंभ कर रहा हूँ।

  2. मैं सत्यापन परीक्षा को ट्रिगर करने के लिए "सबमिट" के भीतर .valid() विधि का उपयोग कर रहा हूं।

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

https://jsfiddle.net/vyaw3ucd/2/


संपादित करें 2:

ओपी के समाधान के अनुसार ...

bootbox.dialog({ 
    // other options, 
    buttons: { 
     success: { 
      label: "Submit", 
      className: "btn btn-sm btn-primary", 
      callback: function() { 
       if ($("#webteamContactForm").valid()) { 
        var form = $("#webteamContactForm"); 
        form.submit(); // form submits and dialog closes 
       } else { 
        return false; // keeps dialog open 
       } 
      } 
     } 
    } 
}); 

हालांकि, बस सीधे आपूर्ति की form तर्क का उपयोग करके, आप नहीं है jQuery सत्यापन प्लगइन के submitHandler विकल्प का उपयोग करते समय कोई त्रुटि है।

submitHandler: function (form) { 
    console.log("Submitted!"); 
    form.submit(); 
} 

डेमो: https://jsfiddle.net/vyaw3ucd/5/

2

धन्यवाद स्पार्की आपकी मदद के लिए, समाधान आपके प्रदान की मुझे जवाब दिया। ऐसा लगता है कि सबमिट हैडलर सबमिट तर्क के लिए कुछ भ्रम का कारण बनता है।

मैं submitHandler हटा दिया और सफलता कॉलबैक के लिए निम्न जोड़ा गया है और सब कुछ उम्मीद

success: { 
     label: "Submit", 
     className: "btn btn-sm btn-primary", 
     callback: function() { 
      if($("#webteamContactForm").valid()){ 
        var form = $("#webteamContactForm"); 
        form.submit(); 
       } else { 
        return false; 
       } 
     } 
    } 
+1

आप वास्तव में 'submitHandler' को हटा नहीं सकते क्योंकि यह प्लगइन में बनाया गया है। हालांकि, कस्टम 'submitHandler' का उपयोग करते समय,' फ़ॉर्म 'तर्क को सीधे' submit ') से जोड़कर अनंत लूप त्रुटियों से बचें। देखें: https://jsfiddle.net/vyaw3ucd/5/ – Sparky

+0

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

+0

हां। मेरा डेमो मूल रूप से केवल अंतर्निहित डिफ़ॉल्ट था ... वह मेरा मुद्दा था। – Sparky

1

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

jQuery:

//Variables created without the keyword var, are always global, even if they are created inside a function. 
    var form = $('#<?echo $PAGEID?>'); 
    var FormError = $('.alert-danger',form); 
    var success = $('.alert-success',form); 

    form.keypress(function(e){ 
     if(e.which == 13){ //TRIGGER SUBMIT THROUGH ENTER  
      document.getElementById('defaultActionButton').click(); 
     } 
    }).validate({ 
     focusInvalid: false, // do not focus the last invalid input 
     onkeyup: false, 
     ignore: ".ignore", //required for hidden input validation ie: hiddenRecaptcha 
     rules:{ 
      "TYPE": { 
       required: true,  
      }, 
      "MSG": { 
       required: true, 
       rangelength:[40,1000] 
      }, 
      "CONTACT": { 
       required: { 
        depends: "#newuser:checked" 
       } 
      }, 
      "EMAIL": { 
       required: true, 
       email: { 
        depends: function() { 
         if(!$("#newuser:checked")) 
          return true; 
         else 
          return false; 
        } 
       }, 
       HTH_TelephoneEmail: { 
         depends: function() { 
          if($("#newuser:checked")) 
           return true; 
          else 
           return false; 
         } 
        } 
      },   
      hiddenRecaptcha: { 
       required: function() { 
        if (grecaptcha.getResponse() == '') { 
         return true; 
        } else { 
         return false; 
        } 
       } 
      } 
     }, 
     messages: { // custom messages for form validation input 
       "TYPE": { 
        required: 'Please select an option as it pertains to your inquiry' 
       }, 
       "MSG": { 
        required: 'Please provide some content as it pertains to your inquiry'  
       }, 
       "CONTACT": { 
       required: "Please enter a contact person or company" 
       }, 
       hiddenRecaptcha: { 
       required: function() { 
        $(".g-recaptcha:first").tooltip("enable").tooltip("show"); 
       } 
       } 
     }, 
     showErrors: function(errorMap, errorList) { 
      // Clean up any tooltips for valid elements 
      $.each(this.validElements(), function (index, element) { 
       element = $(element); 
       NoError_ToolTip(element); 
      }); 
      // Create new tooltips for invalid elements 
      $.each(errorList, function (index, error) { 
       element = $(error.element); 
       message = error.message; 
       Error_ToolTip(element,message); 
      }); 
     },     
     invalidHandler: function (event, validator) { //display error alert on form submit  
      success.hide(); 
      $(document).scrollTop($(".form-body").offset().top); 
     }, 
     submitHandler: function() { 
     Submit_Complete(); //fires ajax call 
    } 
    }); 
0

आप अपने सबमिट बटन के लिए नाम बदल देना चाहिए, क्योंकि आप एक नामकरण-अलग है। उदाहरण के लिए, इसे name="submit" से name="other" पर बदलने का प्रयास करें।

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