2010-06-06 6 views
3

J'ai une boucle while qui crée une liste de tags d'ancrage chacun avec un nom de classe unique comptant de 1 à de nombreux éléments. Je voudrais changer un attriubute de css sur une étiquette d'ancre spécifique et une classe quand on clique dessus ainsi disons que la couleur de fond est changée. Voici mon codeSélecteurs dynamiques avec Jquery avec php while loop

while($row = mysql_fetch_array($results)){ 
$title = $row['title']; 
$i++; 
echo "<a class='$i'>$title</a> 

} 

Je voudrais que mon jquery regarder quelque chose comme ça, il va évidemment être plus compliqué que cela, je suis juste confus où commencer.

$(document).ready(function() { 
$('a .1 .2 .3 .4 and so on').click(function() { 
$('a ./*whichever class was clicked*/').css('background':'red'); 
     }); 
    }); 
+0

Au lieu de classes "uniques", j'utiliserais des identifiants. Et il semble que la même action soit effectuée quel que soit le lien cliqué sur les liens, alors pourquoi ne pas leur donner une classe commune. C'est à quoi servent les classes, assigner des comportements/propriétés similaires à plusieurs éléments. –

+0

Une autre erreur que je viens de remarquer (et corrigée dans ma réponse) est que vous avez un ':' comme séparateur dans votre appel '.css()' au lieu d'un ','. Le deux-points n'est utilisé que si vous passez un objet à '.css()'. – user113716

+0

Je suis d'accord avec @Felix. Sauf si vous avez un but spécifique pour les noms de classe en tant que nombres (comme si vous auriez d'autres éléments avec le même nom de classe), les ID sont généralement utilisés comme identifiants uniques (bien qu'un seul numéro soit un ID valide). pourrait être identique. Le numéro d'index peut également être transmis dans un attribut personnalisé. – user113716

Répondre

2

Pouvez-vous donner à la classe un nom plus cohérent? Comme myClass_1, myClass_2, etc.

Ensuite, vous pouvez faire:

$(document).ready(function() { 
    $('a[class^=myClass_]').click(function() { // Assign handler to elements with a 
               // class that starts with 'myClass_' 
     $(this).css('background','red'); // Change background of clicked one. 

    }); 
}); 

Ici, un « commence par » sélecteur est utilisé pour affecter l'événement à toutes les classes qui commencent par myClass.

Vous pouvez toujours récupérer le numéro d'index si nécessaire.

Dans le gestionnaire d'événements, $(this) fait référence à celui sur lequel vous avez cliqué.

Un exemple concret:http://jsfiddle.net/Jurv3/

Docs pour "commence par" sélecteur:http://api.jquery.com/attribute-starts-with-selector/

EDIT: Je eu un manque ] dans le sélecteur. Fixé maintenant

+0

Il n'y a aucune raison de donner à chacun une classe unique si vous faites référence à $ (this) – colinmarc

+0

@colinmarc - L'OP utilise des classes uniques pour une raison quelconque, donc ma réponse reflète l'exigence de l'OP. Il pourrait y avoir d'autres ensembles d'éléments générés avec des noms de classe identiques. – user113716

2

Vous pouvez utiliser un itérateur sur un tableau comme celui-ci:

var myclasses = [".1",".2",".3"]; // generated by php 

$.each(myclasses, function(index, value) { 
    $('a '+value).click(function() { 
     $(this).css('background':'red'); 
    }); 
}); 

Note: Je pense que vous pourriez être mieux en utilisant ID unique pour chaque élément dans la liste des balises d'ancrage et ont tous partagent une seule classe. C'est plus à quoi servent les classes et les IDs.

1

Donnez-leur simplement la même classe, par exemple, myClass. Puis:

$('a.myClass').click(function() { 
    $(this).css('background':'red'); 
}); 

Cela fonctionne aussi longtemps que vous éprouvez les liens fonctionnent sur eux-mêmes, ou leurs parents - aussi longtemps que la relation entre le lien et la cible est la même pour chacun. Pour opérer sur le parent, ce serait $(this).parent().css(...), et pour fonctionner sur l'élément suivant, ce serait $(this).next().css(...) et ainsi de suite.

+0

Vous n'avez pas besoin d'utiliser 'each()' pour affecter les gestionnaires à tous les éléments 'myClass'. – user113716

+0

Ah, vous avez raison. Mon erreur, je vais éditer – colinmarc

0

Avez-vous essayé quelque chose dans quelque chose comme ça?

while($row = mysql_fetch_array($results)){ 
$title = $row['title']; 
$i++; 
echo '<a class="anchor_link" id="'.$i.'">'.$title.'</a>'; 

} 

Et puis pour le jQuery:

$(document).ready(function() { 
    $('a.anchor_link').click(function() { 
     var thisAnchor = $(this).attr('id'); 
     $(this).css('background':'red'); 
    }); 
}); 

La raison de mon ajouter le var js « thisAnchor » est parce que je suppose que vous avez besoin que je $ variable php comme marqueur d'ancrage? Si c'est le cas, vous pouvez simplement prendre le js var et l'utiliser comme vous le souhaitez. Si vous ne pouvez pas utiliser l'ID parce que le contenu ancré est marqué par id, utilisez un attribut diferent, tel que 'title' ou 'alt'.

J'espère que cela a été utile.