Προς το περιεχόμενο

Πέρασμα στοιχείων ενός πίνακα ως παράμετροι σε συνάρτηση


christian-ago

Προτεινόμενες αναρτήσεις

Δημοσ.

Στην 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 με καθεμια να εχει και διαφορετικο ορισμα. Ευχαριστω.

Δημοσ.

Υπάρχουν αρκετοί τρόποι να λύσεις το πρόβλημα.

 

Η λύση που ζήτησες

 

>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 που θέλεις χωρίς πολλά πολλά.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...