christian-ago Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Στην Javacript εχω κατι σαν κι αυτο: >for (var i = 1; i < 11; i++){ ids[i] = i; document.getElementById(ids[i]).onclick = function (){ Highlight(ids[i]) }; } Δημιουργω δυναμικα συναρτησεις για καθε στοιχειο στον κωδικα html. Φυσικα ο παραπανω κωδικας δεν δουλευει γιατι το Highlight(ids) ειναι λαθος γιατι δεν ειναι ο σωστος τροπος να περασω στοιχεια ενος πινακα σε συναρτηση. Πως μπορω να κανω κατι τετοιο; Δοκιμασα επισης: >for (var i = 1; i < 11; i++){ document.getElementById(ids[i]).onclick = function (){ Highlight(i) }; } το οποιο φυσικα και δουλευει λαθος γιατι η συναρτηση Highlight δεχεται ως ορισμα την τελευταια τιμη του i, ενω εγω θελω να φτιαξω 10 συναρτησεις Highlight με καθεμια να εχει και διαφορετικο ορισμα. Ευχαριστω.
defacer Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Υπάρχουν αρκετοί τρόποι να λύσεις το πρόβλημα. Η λύση που ζήτησες >for (var i = 1; i < 11; i++){ document.getElementById(ids[i]).onclick = (function(index) { return function() { Highlight(index) }; })(i); } Εδώ το πρόβλημα λύνεται επειδή καλείς επιτόπου μια function για να επιστρέψει μια άλλη function, η οποία θα γίνει event handler. Επειδή την πρώτη την καλείς επιτόπου με τη συγκεκριμένη τιμή του i, το closure που γίνεται (το index στην εσωτερική function γίνεται fixed στην τιμή του i) δεν επηρρεάζεται από μετέπειτα μεταβολές του i. Η πιο φυσική λύση (προτιμότερη) >for (var i = 1; i < 11; i++){ document.getElementById(ids[i]).onclick = function (){ Highlight(this.id) }; } Όταν τρέχει ο event handler, "this" είναι το element στο οποίο τον έκανες attach. Άρα με this.id παίρνεις το id που θέλεις χωρίς πολλά πολλά.
christian-ago Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Η καλυτερη λυση ειναι συνηθως η πιο ευκολη!... Ευχαριστω μου γλυτωσες χιλιαδες περιττες συναρτησεις και copy-paste!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.