2013-04-07 9 views
8

पर ऑनक्लिक ईवेंट पर मैंने एक लूप बनाने की कोशिश की है, और एक ऑनक्लिक घटना द्वारा वृद्धि हुई है, लेकिन यह काम नहीं करती है।फॉर लूप

js का एक हिस्सा है:

var gameCase = ['', '', '', '', '', '', '', '', ''], // 9 
    itemLists = $('game').getElementsByTagName('li'); // 9 items 

    for(var i = 0; i < itemLists.length; i++) { 
     // i already egal to 9 
     itemLists[i].onclick = function() { 
       // do something 
     } 
    } 

लेकिन इस मामले में, पाश के लिए पहले से ही इससे पहले कि मैं सूची का एक तत्व पर क्लिक करने में सक्षम था समाप्त हो गया है।

इसके अलावा, मैं उस आइटम सूची को प्राप्त करना चाहता हूं जिसे मैंने क्लिक किया और इसे सरणी पर सहेज लिया। मैंने गेमकेज़ [यह] (ऑनक्लिक फ़ंक्शन में) की कोशिश की, लेकिन मुझे नहीं पता कि यह अच्छा तरीका है या नहीं।

+0

क्या '$ ('खेल') है getElementsByTagName ('ली');', आप jQuery या यहाँ शुद्ध जावास्क्रिप्ट का उपयोग करें? – Eli

+0

@ user1479606 शुद्ध जावास्क्रिप्ट, मैंने अभी अपना खुद का चयनकर्ता बनाया है। – jbr

उत्तर

15

जॉन Resig "जावास्क्रिप्ट निंजा का राज" में बहुत अच्छी तरह से इस विषय को शामिल किया गया (http://ejohn.org/apps/learn/#59)

आप मैं के मूल्य को संरक्षित करने के लिए एक अस्थायी गुंजाइश बनाने की आवश्यकता होगी

for (var i = 0; i < itemLists.length; i++) (function(i){ 
    itemLists[i].onclick = function() { 
     // do something 
    } 
})(i); 

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

var gameCase = ['', '', '', '', '', '', '', '', ''], // 9 
$listParent = $('game').find('ul'), // li's parent 
itemLists = $('game').getElementsByTagName('li'); // 9 items 

var listHandler = (function() { 
    var i = 0; 

    return function() { 
    // $(this) will in here refer to the clicked li 
    i++ // increment i 

    if (i === 9) { 
     $listParent.off('click', 'li', listHandler); //remove eventhandler when i reaches 9 
    } 
    } 
}()); 

$listParent.on('click', 'li', listHandler); // attach eventhandler to ul element 

यह वही करना चाहिए जो आप चाहते हैं, क्योंकि मैं काम पर हूं, अभी इसे जांच नहीं सकता।

+0

@Tim van Elsloo के रूप में बताएं, यह एक अच्छा तरीका है। लेकिन कुछ अजीब बात है, जब मैं कंसोल करता हूं। इससे पहले कि मैं अपनी सूची के किसी भी आइटम पर क्लिक करता हूं, मैं मूल्य मानता हूं, मैं मूल्य कम करता हूं। 'के लिए (var i = 0; i jbr

+0

लंबाई संपत्ति 1 से शुरू होती है और आपकी i var 0 से शुरू होती है। तो आपके पास या तो होगा 1 से शुरू करने के लिए लूप को बदलने के लिए और लंबाई + 1 पर समाप्त करें या फ़ंक्शन के अंदर आइटम सूची में बदलें [i + 1]। क्लिक करें। – ruuska

+0

हाँ, मुझे पता है, यह समस्या नहीं है। लूप का ब्याज, जब मैं 9 के बराबर हूं, तो मैं और कुछ नहीं कर सकता। लेकिन यहां पर, एक तत्व पर क्लिक करने से पहले, फॉर लूप पहले ही समाप्त हो चुका है। मैं चाहूंगा, जब मैं अपनी सूची के किसी आइटम पर क्लिक करता हूं, तो मैं बढ़ता हूं, और जब मैं 9 तक पहुंचा, तो लूप रुक जाता है। – jbr

2

अपने श्रोता लपेटें:

onclick = (function(i) {return function() { 
    ... 
};})(i); 

यह आपके चर गुंजाइश समस्याओं का समाधान करता।

+0

यह काफी अच्छा है, जब मैंने एक सूची आइटम पर चढ़ाई की, तो यह मामले की अच्छी संख्या लौटाता है। लेकिन क्या यह ठीक है, कि क्लिक करने से पहले लूप वृद्धि के लिए? – jbr

1

क्षमा करें अगर मैं आपके प्रश्न को ठीक से समझ नहीं पाया, कोड से मैं समझता हूं कि, आप खेल टैग में पाए गए सभी सूची तत्वों पर एक ऑनक्लिक हैंडलर जोड़ने की कोशिश कर रहे हैं (शायद यह एक वर्ग/आईडी होना चाहिए)।

स्क्रिप्ट टैग/फ़ाइल किसी भी उपयोगकर्ता इंटरैक्शन के बिना लोड होने पर लूप को निष्पादित किया जाएगा।

यदि आप काउंटर के वर्तमान मूल्य का उपयोग करने वाले फ़ंक्शन को असाइन करना चाहते हैं। निम्नलिखित कोड का उपयोग करें:।

itemLists[i].onclick = (function() { 
    return function() { 
     // TODO --- 
     // Your handler code here 
} 
})(); 
संबंधित मुद्दे