jQuery Détermine si une classe correspondante a un identifiant donné


95

Qu'est-ce que jQuery a l'équivalent de l'instruction suivante?

$('#mydiv').hasClass('foo')

afin que vous puissiez donner un nom de classe et vérifier qu'il contient un identifiant fourni.

quelque chose comme:

$('.mydiv').hasId('foo')

Je veux appliquer un style à un certain div. Par exemple, au moment du chargement, toutes les classes avec une classe foo seraient affichées, mais je voudrais peut-être désactiver une instance de la classe foo qui a un identifiant de bar.
Nicholas Murray

1
Ensuite, vous feriez simplement que $('#bar.foo').toggle();vous n'aurez jamais qu'un seul identifiant car ils sont OBLIGATOIRES pour être uniques au document. si vous ne voulez basculer cet identifiant que s'il est de classe, fooajoutez simplement la classe au sélecteur d'identifiant. si le sélecteur trouve un ensemble vide, rien ne se passera, s'il trouve un ensemble avec des résultats (dont il n'y en aura qu'un) alors il basculera l'élément. Je pense que vous y réfléchissez trop.
prodigitals le

3
juste pour dire que c'est frustrant les gens qui disent "pourquoi voudriez-vous jamais faire ça?" quand j'essaye de faire ça maintenant. Le problème avec hasClass est qu'il renvoie True si TOUT élément qui correspond au sélecteur a la classe donnée. Donc, là où j'ai beaucoup de p avec la classe «gâteau» et des noms de classe supplémentaires pour chacun («un», «deux», etc.), j'ai un problème. Je veux sélectionner l'ensemble général de p.cake et ensuite avoir un conditionnel (si class = "one" - $ var = 23 - etc). Le fait est que j'essaie de passer un $ var différent en fonction du nom de classe supplémentaire. J'essaie de ne pas avoir à répéter tout le temps o
Stella

Réponses:


171

Vous pouvez intégrer cette logique dans le sélecteur en combinant plusieurs sélecteurs . Par exemple, nous pourrions cibler tous les éléments avec un identifiant donné, qui ont également une classe particulière:

$("#foo.bar"); // Matches <div id="foo" class="bar">

Cela devrait ressembler à quelque chose que vous écrivez en CSS. Notez qu'il ne s'appliquera pas à tous les #fooéléments (bien qu'il ne devrait y en avoir qu'un), et qu'il ne s'appliquera pas à tous les .baréléments (bien qu'il puisse y en avoir plusieurs). Il ne fera référence qu'aux éléments qui se qualifient sur les deux attributs.

jQuery a également une excellente .isméthode qui vous permet de déterminer si un élément a certaines qualités. Vous pouvez tester une collection jQuery par rapport à un sélecteur de chaîne, un élément HTML ou un autre objet jQuery. Dans ce cas, nous allons simplement le vérifier par rapport à un sélecteur de chaîne:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
+1 pour is(). Il devrait y avoir un .hasId()sélecteur juste parce que cela semble être un partenaire évident pour .hasClass()vraiment ...
Matt Fletcher

43

J'utiliserais probablement $('.mydiv').is('#foo');Cela dit si vous connaissez l'identifiant, pourquoi ne l'appliquez-vous pas simplement au sélecteur en premier lieu?


17
Peut-être que le code entre dans une fonction de rappel qui doit gérer un certain cas différemment. Ainsi, la fonction reçoit automatiquement un objet jQuery avec des attributs inconnus. Dans ce cas, $ ('votre réponse'). Is ('utile');
Peter G

1
Je peux penser à un certain nombre de raisons. Que faire si vous souhaitez appliquer un paramètre spécifique au mobile, par exemple si un élément a l'id = "mobile". Le pourquoi n'est pas important.
Placeable

Eh bien, un seul élément devrait avoir une donnée, idsinon il devrait s'agir d'un autre attribut ... Je suppose que si l'emplacement structurel de l'élément en question change en fonction de la page ou du client / agent utilisateur, alors ok, mais à part ça ... .
prodigitalson

19

mise à jour: désolé, mal compris la question, .has()réponse supprimée .

une autre façon alternative, créer un .hasId()plugin

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
Désolé mais je pense que vous avez mal interprété la question: l' API has () signale ceci: Réduisez l'ensemble des éléments correspondants à ceux qui ont un descendant qui correspond au sélecteur ou à l'élément DOM. L'OP demande comment tester si l'élément avec la classe 'myDiv' a aussi l'ID foo, tandis que has () cherchera les descendants de 'myDiv' ayant l'ID 'foo'.
Inclinaison du

7

Disons que vous parcourez certains objets DOM et que vous voulez trouver et attraper un élément avec un certain ID

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

Vous pouvez soit écrire quelque chose comme trouver

$('#myDiv').find('#bar')

Notez que si vous utilisez un sélecteur de classe, la méthode find renverra tous les éléments correspondants.

ou vous pouvez écrire une fonction itérative qui fera un travail plus avancé

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

Le même code pourrait être facilement modifié pour le sélecteur de classe.

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

Je suis heureux que vous ayez résolu votre problème avec index (), ce qui fonctionne pour vous. J'espère que cela aidera d'autres personnes avec le même problème. À votre santé :)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

chacun est inutile car il n'y en aura jamais plus d'un #theMysteryId.
prodigitals le

2
Eh bien, cela vous évite de l'affecter à une variable, de vérifier si la longueur n'est pas vide, puis de continuer avec le code. Si le sélecteur ne correspond à rien, jQuery n'appellera tout simplement pas la fonction "each", donc c'est agréable et propre. Maintenant, si tout ce que vous voulez faire est d'appeler une API jQuery, alors bien sûr.
Pointy

4

Juste pour dire que j'ai finalement résolu cela en utilisant index ().

RIEN d'autre ne semblait fonctionner.

Donc, pour les éléments frères, c'est une bonne solution si vous sélectionnez d'abord par une classe commune et que vous souhaitez ensuite modifier quelque chose différemment pour chaque classe spécifique.

EDIT: pour ceux qui ne savent pas (comme moi) index () donne une valeur d'index pour chaque élément qui correspond au sélecteur, à partir de 0, en fonction de leur ordre dans le DOM. Tant que vous savez combien d'éléments il y a avec class = "foo", vous n'avez pas besoin d'un identifiant.

Évidemment, cela n'aidera pas toujours, mais quelqu'un pourrait le trouver utile.



1

Vous pouvez également vérifier si l'élément id est utilisé en procédant ainsi:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

J'utilise cette méthode pour les tables de données globales et les tables de données ordonnées spécifiques


l'indéfini doit être entre guillemets afin de fonctionner comme si «undefined»
Leo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.