2010-11-17 6 views
1

J'ai un code comme ceci:jQuery - rendre le long code facile court (boucle je suppose)?

$("#item-1").hover(function(e) { 
     e.preventDefault(); 
     $("#item-text").stop().animate({marginLeft: "0px"}); 
     $("#item-1-image").animate({opacity: 1}); 
    }) 

$("#item-1").mouseout(function() { 
    $("#item-1-image").animate({opacity: 0}); 
}) 

Je dois répéter cette opération pour changer tout "élément-1" à "article-2", "article-3", etc.

exactement 10 fois Comment faire ça?

[modifier]

Quel est le meilleur/chemin le plus court - car en fait je sais comment forcer à travailler, mais ce n'est pas une façon élégante;)

+0

qu'est-ce que votre HTML ressemble? – hunter

Répondre

0

Vous pouvez utiliser un javascript régulier pour chaque boucle .

for (var i = 1; i <= 10; i++) { 
    $("#item-" + i).hover(... 
} 
+0

Vous pouvez passer en revue votre JavaScript dans le ci-dessus; ce n'est pas tout à fait vrai. – Phrogz

+0

oui, très drôle (oh types) –

0
for (var i=1;i<=10;++i){ 
    $('#item-'+i).hover(...).mouseout(...); 
} 
0
for (var i=1;i<11;i++) 
{ 
$("#item-"+i).hover(function(e) { 
     e.preventDefault(); 
     $("#item-text").stop().animate({marginLeft: "0px"}); 
     $("#item-"+i+"-image").animate({opacity: 1}); 
    }) 

$("#item-"+i).mouseout(function() { 
    $("#item-"+i+"-image").animate({opacity: 0}); 
}) 
} 
+1

Cela ne fonctionnera pas parce que la valeur de «i» dans les gestionnaires sera la dernière valeur de la fin de la boucle 'for'. – user113716

1

Vous ne devriez pas faire hover() et mouseout(). La méthode .hover() accepte 2 fonctions représentant mouseenter et mouseleave.

Donner les éléments d'une classe commune, puis extraire le numéro de l'ID

$(".someClass").hover(function(e) { 
     var num = this.id.split('-').pop(); 
     e.preventDefault(); 
     $("#item-text").stop().animate({marginLeft: "0px"}); 
     $("#item-" + num + "-image").animate({opacity: 1}); 
}, function() { 
     var num = this.id.split('-').pop(); 
     $("#item-" + num + "-image").animate({opacity: 0}); 
}); 

Si vous ne pouvez pas ajouter une classe pour une raison quelconque, vous pouvez faire une boucle, mais vous devez utiliser un javascript fermeture pour conserver la valeur de l'index pour les gestionnaires.

for(var i = 1; i < 11; i++) { 

    (function(num) { 
     $("item-" + i).hover(function(e) { 
       e.preventDefault(); 
       $("#item-text").stop().animate({marginLeft: "0px"}); 
       $("#item-" + num + "-image").animate({opacity: 1}); 
     }, function() { 
       $("#item-" + num + "-image").animate({opacity: 0}); 
     }); 
    })(i); 

} 
+0

Cela fonctionne bien je crois mais comment modifier marginLeft dynamiquement? J'ai oublié de dire que cela devrait être 0 pour le premier article 250px pour le 2ème article, 500 pour le 3ème article. etc. J'essaie "500 * i" mais ne semble pas fonctionner. Merci beaucoup de toute façon! – fomicz

+0

@formicz '(num - 1) * 250' vous voulez dire? Notez le passage de 1-index à 0-index, le facteur d'échelle correct, et l'utilisation de 'num' vs' i' (qui est * partagé * sur tous les gestionnaires!) –

+0

@fornicz - Si vous utilisez le second par exemple, faites '250 * (num - 1)'. La raison est la même que nous utilisons 'num' dans les gestionnaires pour le sélecteur. Au moment où le gestionnaire s'exécute, la boucle est terminée et 'i === 11'. Puisque nous avons créé une fermeture, et y avons passé 'i', en la référençant avec la variable locale' num', la valeur de 'num' persistera, donc ce sera toujours le même nombre que lors de la création de la fermeture dans le boucle. – user113716

1

L'événement hover doit gérer les événements over et out très bien. Si vous êtes bloqué avec ces identifiants, vous pouvez utiliser un ^= pour sélectionner les ID commençant par "item-".

$("div[id^='#item-']").hover(
    function(e) { 
     e.preventDefault(); 
     $(this).find("p").stop().animate({marginLeft: "0px"}); 
     $(this).find("img").animate({opacity: 1}); 
    }, 
    function() { 
     $(this).find("img").animate({opacity: 0}); 
    } 
); 

Vous devriez mieux utiliser une classe css car ces sélecteurs seraient beaucoup plus faciles à utiliser.

+1

Comment pouvez-vous être certain que le '' pour animer est imbriqué dans l'élément, et qu'il n'y en a qu'un seul? (Assurez-vous également de retirer le '#' du sélecteur d'origine.); O) – user113716

0
$(".item").hover(function(e) { 
     e.preventDefault(); 
    $("#item-text").stop().animate({marginLeft: "0px"}); 
    $(".itemImage[number='"+$(this).attr("number")+"']").animate({opacity: 1}); 
},function() { 
    $(".itemImage[number='"+$(this).attr("number")+"']").animate({opacity: 0}); 
}); 
  1. Utilisez vol stationnaire pour les deux événements
  2. Utilisez les classes et un attribut, pas ids avec des numéros
Questions connexes