2010-12-14 16 views
6

मेरे पास एक ऐसा फॉर्म है जिसे आप डेटाबेस में डेटा जोड़ सकते हैं। यह सब jquery और AJAX के साथ किया जाता है, इसलिए जब आप सबमिट करते हैं तो यह कोड को मान्य करता है और फिर यदि सब कुछ सही है तो यह पेज को रीफ्रेश करने के साथ पोस्ट डेटा सबमिट करता है। समस्या यह है कि फॉर्म पहली बार काम करता है, लेकिन फिर जब आप फॉर्म के साथ एक और प्रविष्टि सबमिट करते हैं तो यह काम नहीं करता है। मैंने सोचा कि यहJquery फॉर्म केवल पहली बार सबमिट करने पर काम करता है, और दूसरा

$(document).ready(function(){ 

के साथ कुछ था लेकिन मैं वास्तव में नहीं पता है। मैंने नीचे दिए गए कुछ कोड चिपकाए हैं। यह बहुत लंबा है, लेकिन यह जानने के लिए पर्याप्त जानकारी देनी चाहिए कि यह क्या कर रहा है। पूरे js फ़ाइल अभी, पहली बार जब आप प्रपत्र यह बहुत अच्छा काम करता है का उपयोग http://www.myfirealert.com/callresponse/js/AddUser.js

$(document).ready(function(){ 
$('#AddCaller').click(function(e){ 

    //stop the form from being submitted 
    e.preventDefault(); 

    /* declare the variables, var error is the variable that we use on the end 
    to determine if there was an error or not */ 
    var error = false; 
    var Firstname = $('#Firstname').val(); 
    ...OTHER FORM FIELDS HERE 

    /* in the next section we do the checking by using VARIABLE.length 
    where VARIABLE is the variable we are checking (like name, email), 
    length is a javascript function to get the number of characters. 
    And as you can see if the num of characters is 0 we set the error 
    variable to true and show the name_error div with the fadeIn effect. 
    if it's not 0 then we fadeOut the div(that's if the div is shown and 
    the error is fixed it fadesOut. */ 


    if(Firstname.length == 0){ 
     var error = true; 
     $('#Firstname_error').fadeIn(500); 
    }else{ 
     $('#Firstname_error').fadeOut(500); 
    } 
    if(Lastname.length == 0){ 
     var error = true; 
     $('#Lastname_error').fadeIn(500); 
    }else{ 
     $('#Lastname_error').fadeOut(500); 
    } 
    ...MORE CONDITIONAL STATEMENTS HERE 




    //now when the validation is done we check if the error variable is false (no errors) 
    if(error == false){ 
     //disable the submit button to avoid spamming 
     //and change the button text to Sending... 
     $('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); 

     /* using the jquery's post(ajax) function and a lifesaver 
     function serialize() which gets all the data from the form 
     we submit it to send_email.php */ 
     $.post("doadd.php", $("#AddCaller_form").serialize(),function(result){ 
      //and after the ajax request ends we check the text returned 
      if(result == 'added'){ 

       //$('#cf_submit_p').remove(); 
       //and show the success div with fadeIn 
       $('#Add_success').fadeIn(500); 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Add A Caller'); 
       document.getElementById('Firstname').value = ""; 
       document.getElementById('Lastname').value = ""; 
       document.getElementById('PhoneNumber').value = ""; 
       document.getElementById('DefaultETA').value = ""; 
       document.getElementById('Apparatus').value = ""; 
       document.getElementById('DefaultLocation').value = ""; 


       setTimeout(" $('#Add_success').fadeOut(500);",5000); 

      }else if(result == 'alreadythere'){ 
            //checks database to see if the user is already there 
       $('#Alreadythere').fadeIn(500); 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Add A Caller'); 
      } 
      else{ 
       //show the failed div 
       $('#Add_fail').fadeIn(500); 
       //reenable the submit button by removing attribute disabled and change the text back to Send The Message 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Send The Message'); 

      } 
     }); 
    } 
});  
}); 

पर है। और बटन को फिर से सक्षम किया गया है, लेकिन फिर जब आप कोई अन्य प्रविष्टि करने का प्रयास करते हैं और बटन पर क्लिक नहीं होता है।

सहायता के लिए धन्यवाद!

संपादित करें: फ़ॉर्म सबमिट करने के बाद पहली बार बटन अभी भी सक्षम है और आप उस पर क्लिक कर सकते हैं, लेकिन जब आप उस पर क्लिक करते हैं तो कुछ नहीं होता ... भले ही आप फॉर्म भरें। ऐसा लगता है कि फॉर्म की क्लिक घटना पहली बार फायरिंग नहीं कर रही है।

EDIT2 जैसा कि अनुरोध किया गया है, मैं HTML पोस्ट करने जा रहा हूं, यह एक पासवर्ड संरक्षित साइट के पीछे है, इसलिए मैं आपको पृष्ठ लिंक नहीं भेज सकता।

<form action='addcallers.php' method='post' id='AddCaller_form'> 

<h2>Add Callers</h2> 
<p> 
First Name: 
<div id='Firstname_error' class='error'> Please Enter a First Name</div> 
<div><input type='text' name='Firstname' id='Firstname'></div> 
</p> 

<p> 
Last Name: 
<div id='Lastname_error' class='error'> Please Enter a Last Name</div> 
<div><input type='text' name='Lastname' id='Lastname'></div> 
</p> 
...MORE FORM FIELDS HERE 


<div style="display:none;"> 
<input type='text' name='DefaultLocation' id='DefaultLocation' value= "Sometthing"  readonly=readonly > 

</div> 
</p> 

<p> 




<div id='Add_success' class='success'> The user has been added</div> 
<div id='Alreadythere' class='error'> That user is already in the database</div> 
<div id='Add_fail' class='error'> Sorry, don't know what happened. Try later.</div> 
<p id='cf_submit_p'> 
<input type='submit' id='AddCaller' value='Send The Message'> 
</p> 
</form> 

</div> 

EDIT3 भी पृष्ठ पर अन्य ajax नहीं है, लेकिन यह सीधे जावास्क्रिप्ट में लिखा है। मुझे यकीन नहीं है कि क्या यह किसी भी तरह से कार्यक्षमता को प्रभावित करेगा। लेकिन यदि आवश्यक हो तो मैं उस अजाक्स को भी पोस्ट कर सकता हूं।

EDIT4 मैं http://web.enavu.com/tutorials/create-an-amazing-contact-form-with-no-ready-made-plugins/ से मूल ट्यूटोरियल मिला है और यह

संपादित संशोधित कुछ अलग अलर्ट में डालने के बाद, मुझे पता चला है कि यह सशर्त बयान if(error==false)... कोई आइडिया क्यों नहीं करता है?

+0

शीघ्रता से अवलोकन से, इस ठीक काम करना चाहिए। कुंजी लाइनों में अलर्ट जोड़ें और देखें कि यह कहां रुक गया है या बेहतर है, फिर भी इसे फ़ायरबग या कुछ समकक्ष के साथ डीबग करें, और हमें परिणाम बताएं। –

+0

हां - विशेष रूप से, मैं यह सुनिश्चित करने के लिए "अलर्ट()" या "console.log()" का उपयोग करता हूं कि दूसरे क्लिक पर "क्लिक" हैंडलर लगाया जा रहा है। – Pointy

+0

क्लिक ईवेंट को दूसरी बार नहीं कहा जा रहा है। आप जो भी चाहते हैं उसे क्लिक कर सकते हैं, लेकिन यह कुछ भी नहीं करता – Bill

उत्तर

4

सबसे अधिक संभावना है, यह #DefaultLocation क्षेत्र है, क्योंकि यह एक केवल पढ़ने के लिए है और आप पहली पोस्ट के बाद रीसेट कर रहे हैं:

document.getElementById('DefaultLocation').value = ""; 

और कभी नहीं बदल रहा है यह कुछ करने के लिए वापस मान (या आप कर रहे हैं?

  1. यह
  2. सेट यह रूप में प्रस्तुत करने के बाद कुछ के साथ मूल्य है
  3. यह बिल्कुल मान्य नहीं है क्योंकि यह एक पढ़ा है केवल रीसेट नहीं करते हैं:) तो आप निम्न में से एक क्या करना है और आप इसे एक छिपे हुए इनपुट के रूप में उपयोग कर रहे हैं (जो कि रास्ते में गलत है)!

भी, यह अन्य "अजाक्स" कोड हो सकता है जिसके बारे में आप बात कर रहे हैं, तो कृपया इसे यहां पोस्ट करें, यहां तक ​​कि आपके पास पृष्ठ पर कहीं और अन्य फ़ील्ड (तत्व) हैं जो समान आईडी वाले हैं प्रपत्र ..

वैसे भी, यहाँ sometips आप के लिए कर रहे हैं: 1- बंद इनपुट टैग सही ढंग से (जोड़ें/इसका अंत करने के लिए):

<input type='text' name='Firstname' id='Firstname' /> 

2- सुनिश्चित करें कि सभी DIVs बनाने के लिए और पी.एस. बंद हो जाती हैं ... जैसा कि ऐसा लगता है कि आपके पास यहां एक खुला पी है:

<p> 


<div id='Add_success' class='success'> The user has been added</div> 
<div id='Alreadythere' class='error'> That user is already in the database</div> 
<div id='Add_fail' class='error'> Sorry, don't know what happened. Try later.</div> 
</p> <---- missing this one 
<p id='cf_submit_p'> 

3- आप त्रुटि चर हर समय redeclaring कर रहे हैं, आप ऐसा करने की जरूरत नहीं:

if(Firstname.length == 0){ 
    var error = true; 
.... 

सिर्फ वर यह आप सभी स्थानों पर लागू होता है बिना error = true; का उपयोग अपने मूल्य बदल रहे हैं

var error = false; 

बजाय इस बात का 4-:

0 केवल आरंभीकरण पर वर का उपयोग
$('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); 

उपयोग:

$('#AddCaller').attr({'disabled' : 'disabled', 'value' : 'Adding...' }); 

5- आप एक छिपी हुई फ़ील्ड के रूप में DefaultLocation उपयोग कर रहे हैं तो बजाय इस की:

<div style="display:none;"> 
<input type='text' name='DefaultLocation' id='DefaultLocation' value= "Sometthing"  readonly=readonly /> 

</div> 

उपयोग:

<input type="hidden" name="DefaultLocation" id="DefaultLocation" value="Something" /> 
+0

मैंने इस उत्तर को ऊपर उठाया, लेकिन w3 ने अक्षम विशेषता के लिए मानक मान निर्दिष्ट नहीं किया है। सच है बुलियन विशेषताओं के लिए सबसे अच्छा विकल्प विकल्प है। माइक्रोसॉफ्ट ने यह सुझाव दिया कि 'अक्षम = "अक्षम" 'विजुअल स्टूडियो में सही था, लेकिन इसकी आवश्यकता नहीं है। – jwiscarson

+0

@jwiscarson: क्या आपको यकीन है? http://reference.sitepoint.com/html/input/disabled भी नया HTML5: http://www.w3.org/TR/html-markup/input.text.html#input.text.attrs.disabled – ifaour

+0

आप सही हैं - एचटीएमएल 5 में, यह या तो अक्षम है, अक्षम = "", या अक्षम = "अक्षम"। मैं एक संदर्भ के रूप में एचटीएमएल 5 का उपयोग नहीं करता, हालांकि, दस्तावेज़ प्रगति पर एक काम है। – jwiscarson

-2

इसे बदलने के लिए प्रयास करें: $('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); कि में : $('#AddCaller').attr({'value' : 'Adding...' });

यह यह काम करना चाहिए।

+0

वह चाहता है ** POST उड़ान भरने पर इसे अक्षम किया जाए। – Pointy

1

अक्षम की विशेषता को न हटाएं, इसे गलत पर सेट करें।

इस लाइन

$('#AddCaller').removeAttr('disabled').attr(... 

होना चाहिए

बदलें प्रपत्र के प्रस्तुत ईवेंट हैंडलर के लिए क्लिक करें ईवेंट हैंडलर का उपयोग करने से बदलने के लिए

$('#AddCaller').attr('disabled', false).attr(... 
+0

बहुत सोचा लेकिन यह: http://jsfiddle.net/jksLm/ मुझे गलत साबित कर दिया। : -/ –

+0

आप अक्षम एटीआर को हटाना चाहते हैं क्योंकि इसकी उपस्थिति अक्षम है, इससे कोई फर्क नहीं पड़ता कि इसका क्या महत्व है। कष्टप्रद। – carbontax

2

आज़माएं: $('#AddCaller').click

करने के लिए यह: $('#AddCaller_form').submit

+0

यह एक अच्छा जवाब है, मुझे यकीन नहीं है कि 'अक्षम' में एक विशेषता को ईवेंट हैंडलर के साथ क्या सेटिंग है, संभवतः यह उन्हें छोड़ देता है? इस जवाब के साथ आपको परवाह करने की आवश्यकता नहीं है। – brad

+0

काम नहीं करता .... – Bill

0

मुझे लगता है कि दूर करने और विशेषताएं जोड़ना द्वारा, तत्व हटा दिया और नया एक के द्वारा बदल दिया जाता है, लेकिन हैंडलर नहीं फिर से जुड़ा हुआ है मान लेते हैं। .click()

0

यह फ़ंक्शन php को प्रश्न भेजता है और AJAX का उपयोग करके php फ़ाइल से परिणाम वापस कर सकता है। मैंने गाइड के लिए टिप्पणियां छोड़ी हैं। & कैच स्टेटमेंट्स के साथ पहला भाग संशोधनों की आवश्यकता नहीं है। जाना # 1 और # 2

function ajaxFunction(){ 
     var ajaxRequest; 


     //Browser compatible. keep it as it is 
     try{ 
      // Opera 8.0+, Firefox, Safari 
      ajaxRequest = new XMLHttpRequest(); 
     } catch (e){ 
      // Internet Explorer Browsers 
      try{ 
       ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try{ 
        ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e){ 
        // Something went wrong 
        alert("Your browser broke!"); 
        return false; 
       } 
      } 
     } 
     //Browser compatible end 



     ajaxRequest.onreadystatechange = function(){ 
      if(ajaxRequest.readyState == 4){ 
        //#2 opional: create functions to return data from your php file 
        $('#resultArea').html(ajaxRequest.responseText); 
      } 
     } 

     //#1 Set the form method, filename & query here here 
     ajaxRequest.open("GET", "serverTime.php?query=something", true); 
     ajaxRequest.send(null); 
    } 



उदाहरण:

<input type='submit' value='ajax-submit' onclick='ajaxFunction()' /> 
0

कि के लिए त्वरित jQuery प्लगइन के बाद से आप अपनी साइट पर लगभग हर ajax रूप में इस का उपयोग कर सकता है:

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

jQuery.extend(jQuery.fn, { 
    formToggle: function (enable){ 
    return this.each(function(){ 
     jQuery(this)[(enable ? 'remove' : 'add') + 'Class']('disabled') 
     .find(':input').attr('disabled', !enable); 
    }, 
    enable: function(){ return this.formToggle(true); }, 
    disable: function(){ return this.formToggle(false); } 
} 
फिर अपने JQ ajax कोड पर

:

[...]

var $form = $(your_form).submit(function(){ 
    $.ajax({ 
    type: 'post', 
    url: "/whatever/", 
    data: $form.serialize(), 
    success: function(){ alert ('yay');}, 
    complete: function(){ $form.enable();}, 
    error: function(){ alert('insert coin')} 
    } 
    $form.disable(); 
    return false; 
}); 

जबकि रूपों भेज रहा है यह ठीक से प्रविष्टियों पर ब्लॉक करने के लिए पर्याप्त होना चाहिए /डेटा मिल रहा है। तुम सच में आप एक चेक इतना है कि यह दो बार पल उपयोगकर्ता सबमिट करें और क्षेत्रों के साथ विकलांग पाने से चलाता है के बीच नहीं भेजा जा सकता जोड़ सकते हैं पागल कर रहे हैं: अगर ('। विकलांग' $ form.is()) return false; प्रस्तुत हैंडलर की पहली पंक्ति के रूप में है, लेकिन यह टी के लिए आवश्यक हो नहीं करना चाहिए वास्तव में

0

Firebug में कुछ breakpoints सेट और घड़ी इसे कहीं हो जाता है। बटन जमा करने और प्रभाव लागू करने के बाद अपने क्लिक हैंडलर को खो सकता है। जमा करने और सामान के बाद आपको शायद क्लिक हैंडलर को फिर से असाइन करने की आवश्यकता है।

0

नहीं 100 इस पर% लेकिन कोड को एक अलग समारोह टी के रूप में सेट करने का प्रयास करें मुर्गी अंत में क्लिक घटना को rebind।

उदाहरण:

function addCaller(e) { 
    // your unchanged code 
    $('#AddCaller').click(addCaller(e)); 
} 

$(document).ready(function(){ 
    // added an unbind just in case 
    $('#AddCaller').unbind('click').click(addCaller(e)); 
}); 
संबंधित मुद्दे