2012-11-13 20 views
5

संपादित करें **की रोकथाम "बहुत ज्यादा प्रत्यावर्तन" jQuery में त्रुटि

मैं इस क्लिक करें घटना है

$('.next-question').click(function() { 

    $('td').removeClass('highlight-problem'); 
    var r = rndWord; 
    while (r == rndWord) { 
     rndWord = Math.floor(Math.random() * (listOfWords.length)); 
    } 
    $('td[data-word="' + listOfWords[rndWord].name + '"]').addClass('highlight-problem'); 
    $('td[data-word=' + word + ']').removeClass('wrong-letter').removeClass('wrong-word').removeClass('right-letter'); 
    var spellSpace = $('td[data-word=' + listOfWords[rndWord].name + ']').hasClass('right-word'); 
    if (spellSpace) { 

     $('.next-question').trigger('click'); 

    } else { 

     $("#hintSound").attr('src', listOfWords[rndWord].audio); 
     hintSound.play(); 
     $("#hintPic").attr('src', listOfWords[rndWord].pic); 
     $('#hintPic').show(); 
     $('#hintPicTitle').attr('title', listOfWords[rndWord].hint); 
     $('#hintPicTitle').show(); 

    } 

}); 

जब सांत्वना यह कहता है too much recursion जिसका अर्थ यह अंतहीन लूप के कुछ प्रकार में है में डिबग इस समय। मुझे लगता है कि घटना if कथन में हुई है, क्योंकि मैंने कुछ ऐसा ऑनलाइन देखा है।

असल में, मैं कहना चाहता हूँ ... अगर दिए गए शब्द, और वर्ग right-word फिर आगे बढ़ें (इसलिए ट्रिगर) है,

वहाँ एक और तरीका यह लिखने के लिए कि क्रैश नहीं करेंगे है? http://jsfiddle.net/Dxxmh/112/

अनुदेश::

यहाँ एक बेला है हाइलाइट किए गए क्षेत्र (छवियों आप वर्तनी शब्द ताकि आप वर्तनी करने के लिए है एक बेला में उपलब्ध नहीं हैं मदद करने के लिए ग्रिड में वर्तनी के अधिकार पर पत्र के लिए क्लिक करें उन्हें कंसोल का उपयोग कर, यह उपयोग करने के लिए की तलाश में टीडी के)

+0

"आगे बढ़ना" से आपका क्या मतलब है? क्या आप कहीं और परिभाषित एक क्रिया को फ़िल्टर करने की कोशिश कर रहे हैं? –

+0

आपका लक्ष्य क्या है? आप 'ट्रिगर' के बारे में सही हैं - वह जगह है जो रिकर्सन का कारण बन सकती है। और आपके पास रिकर्सन को रोकने के लिए कुछ तंत्र होना चाहिए (अन्यथा शाखा में जाएं या दूसरे तरीके से हैंडलर निकास को रोकें)। लेकिन यह कहना मुश्किल है कि इसे सही तरीके से कैसे रोका जा सकता है। –

+0

लूपिंग रखने के रूप में आगे बढ़ें जब तक कि वह उस श्रेणी के बिना किसी को नहीं ढूंढता @dystroy –

उत्तर

2

मैं कुछ इस तरह करना होगा::

if (spellSpace) { 
      if(score.right != 4) 
       $('.next-question').trigger('click'); 
इसे ठीक करने के लिए सबसे अच्छा तरीका नहीं घटना दूसरी बार ट्रिगर द्वारा हैंडलर आह्वान करने के लिए, लेकिन एक समारोह नाम का उपयोग कर यह फोन करके है

मुझे लगता है कि if(score.right == 4) का मतलब गेम का अंत है। समाप्त होने के बाद - आपके पास कोई शब्द नहीं है (या बस कोई "सही" शब्द नहीं है, निश्चित रूप से नहीं) और यही कारण है कि यह कभी नहीं रुकता है। यह बस कुछ भी करने से रोकने के बजाय हमेशा के लिए क्लिक करता है और उपयोगकर्ता को पुनरारंभ बटन क्लिक करने के लिए प्रतीक्षा करें।

मुझे लगता है कि स्थिति पर्याप्त नहीं है। सुनिश्चित नहीं है कि गलत शब्दों की संख्या कैसे गिना जाता है और संभाला जाता है। लेकिन यह आपके प्रोग्राम तर्क के आधार पर आगे बढ़ने और सही स्थिति बनाने के लिए पर्याप्त होना चाहिए। आपके द्वारा शुरू किया गया कोई भी रिकर्सन (और आप इसे ट्रिगर ("क्लिक") से शुरू करते हैं) में स्टॉप हालत होनी चाहिए।

+0

के लिए संपादित है तो यह बंद हालत? मैं इसे कहाँ रखा है? @FAngel –

+0

यह जब खेल सभी सही शब्दों के साथ समाप्त हालत रोक है। मैं क्या पता नहीं है अन्य मामले हैं जब इसे रोक दिया जा सकता है। और मुझे लगता है कि यह आपके काम पर विचार करने और सही स्थिति बनाने का आपका काम है। –

+0

तो मुझे इसे एक अलग स्टेटम के रूप में रखना चाहिए ईएनटी? @FAngel –

0

प्रयास द्वारा:

$('.next-question').click(function (event) { 
    event.preventDefault(); 
}); 
+3

आप क्यों लिखते हैं ** ** कोशिश करें, क्या आप इसे काम करने की उम्मीद करते हैं? क्या आप समझा सकते हैं कि आपको ऐसा क्यों लगता है कि यह काम करेगा? – gdoron

+1

बहुत अधिक रिकर्सन त्रुटि एक क्लिक ईवेंट पर एक बाइंड फ़ंक्शन के कारण है। यह अतीत में मेरे साथ हुआ था। शायद .next-question एक एंकर या एक बटन है जो स्वयं को एक घटना को फायर करता है। इनपुट इनपुट पर 2 दिन पहले मुझे एक ही समस्या थी। क्या वह और मेरे लिए काम किया। –

+0

ठीक है, अगर आप पोस्ट किए गए कोड को समझा सकते हैं, तो आप उत्तर में ऐसा क्यों नहीं करेंगे? और बीटीडब्ल्यू, मुझे नहीं लगता कि यह समस्या है, समस्या यह है कि वह क्लिक ईवेंट को एक क्लिक हैंडलर => अनंत लूप के अंदर से ट्रिगर करता है। जैसा कि मैंने देखा है 'रोकथाम' के साथ इसका कोई लेना-देना नहीं है। – gdoron

2

.trigger('click') सिर्फ श्रोता लागू करेगा एक बार फिर। क्या आप केवल उस परिस्थिति में लिंक का पालन करना चाहते थे? उस स्थिति में आप return false अपने else परिदृश्य में कर सकते हैं।

2

यह एक jQuery मुद्दा नहीं है: आप मैन्युअल रूप से हैंडलर के भीतर से एक ही घटना ट्रिगर कर रहे हैं:

$('.next-question').trigger('click'); 

अब, यह अनंत लूप उत्पन्न अगर आप सावधान नहीं हो जाएगा।

$('.next-question').click(function callMe(event) 
{ 
     //replace: $('.next-question').trigger('click'); 
     //with this: 
     if (spellSpace && event) 
     {//also check if the event has been passed 
      callMe.apply(this,[]);//don't pass event for recursive call 
     } 
}); 
+0

मुझे यकीन नहीं है कि मुझे यह कहां मिलना है। क्षमा करें, क्या आप मुझे दिखा सकते हैं? @Elias Van Ootegem –

+0

@ मिलो-जे: आपके हैंडलर के अंत में एक और है, जो 'if (spellSpace) {$ ('। Next-question ') से शुरू होता है। ट्रिगर (' क्लिक करें '); } else {... '' if (spellSpace) {'के साथ' if (spellSpace && event) 'और '$ ('। next-question ') को प्रतिस्थापित करें। ट्रिगर (' क्लिक करें ');' कॉल के साथ '। लागू करें (यह, []); ', लेकिन '$ ('। next-question ') को प्रतिस्थापित करने के लिए मत भूलना। क्लिक करें (function() {' '' $ ('। next-question ') पर क्लिक करें। (क्लिक करें callMe (event) '// <- फ़ंक्शन को –

+0

पर कॉल करने के लिए एक नाम दें, यह पहले दौर में कोई सही शब्द नहीं मिलने के बाद ही दूसरी कॉल पर रुक जाएगा। लेकिन यह ऐसा नहीं करेगा जो इसे करना चाहिए। –