Vous pouvez utiliser un for
boucle, mais assurez-vous que le compteur de boucle, la valeur est dans un domaine approprié pour click
gestionnaire d'événements:
var clickHandler = function(k) {
return function() {
$('#list').fadeOut(450);
$('#q' + k).delay(600).fadeIn(450);
};
};
for (var i = 1; i < 14; ++i) {
$('#p' + i).click(clickHandler(i));
}
Sinon, l' delay
et fadeIn
serait appliquée à l' #q13
élément exclusivement, depuis le compteur réelles (avec sa valeur finale de 13 ans) est en la fermeture.
EDIT: Depuis beaucoup de réponses a mal ici, je vais essayer d'expliquer plus précisément ce qui se passe dans ce code, comme cela semble être assez déroutant.
La solution "naturelle" avec l'injection du gestionnaire de clic directement dans la boucle serait le suivant:
for(var i = 1; i < 14; i++) {
$('#p'+i).click(function() {
$('#list').fadeOut(450);
$('#q'+i).delay(600).fadeIn(450)
});
}
Mais ce n'est pas du tout équivalent à la forme allongée, qui répertorie tous les 13 variantes l'un après l'autre. Le problème est que, s'il y a en effet de 13 fonctions de créés ici, ils sont tous fermés au cours de la même variable i
, dont la valeur change. Il arrive enfin à la valeur de 13
et la boucle se termine.
Quelques temps plus tard les fonctions liées à l' #p1
...#p13
éléments sont appelés (lorsque l'un de ces éléments est cliqué) et ils utilisent cette valeur finale de l' i
. Il en résulte que dans #q13
animés.
Ce qui doit être fait ici est de faire quelque chose appelé lambda de levage et d'éliminer la variable indépendante i
, dont la valeur est inadvertly changé. Une technique courante consiste à fournir une usine de fonction", qui accepte de la valeur pour nos variables et les sorties d'une fonction que nous allons utiliser en tant que gestionnaire d'événements:
var clickHandler = function(k) {
return function() {
$('#list').fadeOut(450);
$('#q' + k).delay(600).fadeIn(450);
};
};
Puisque la portée de l' k
paramètre local d' clickHandler
, de chaque appel d' clickHandler
obtient différente k
variable. La fonction retourné à partir de clickHandler
est donc fermé sur différentes variables, qui peuvent à leur tour avoir des valeurs différentes. C'est exactement ce dont nous avons besoin. On peut alors appeler clickHandler
de notre boucle, en lui passant la valeur du compteur:
for (var i = 1; i < 14; ++i) {
$('#p' + i).click(clickHandler(i));
}
J'espère que ce qui fait la différence un peu plus clair.
EDIT: Comme Esailija souligné dans les commentaires, il est également possible d'utiliser jQuery.each
afin d'obtenir le même effet:
$.each(new Array(13), function(idx) {
$('#p' + (idx + 1)).click(function() {
$('#list').fadeOut(450);
$('#q' + idx).delay(600).fadeIn(450);
});
});
C'est probablement la solution de choix si vous êtes déjà au courant de la fermeture/portée du problème que j'ai essayé de décrire ci-dessus.