jQuery Determina se una classe corrispondente ha un dato id


95

Cos'è jQuery ha l'equivalente id della seguente dichiarazione?

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

così potresti dare un nome di classe e controllare che contenga un id fornito.

qualcosa di simile a:

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

Voglio applicare uno stile a un determinato div. Ad esempio al momento del caricamento verrebbero mostrati tutti con una classe foo, ma potrei voler disattivare un'istanza della classe foo che ha un id di bar.
Nicholas Murray

1
Quindi faresti semplicemente $('#bar.foo').toggle();che avrai sempre e solo un ID poiché è NECESSARIO che siano univoci per il documento. se vuoi solo attivare quell'id se è di classe, fooaggiungi semplicemente la classe al selettore di id. se il selettore trova un set vuoto non accadrà nulla, se trova un set con risultati (di cui ce ne sarà solo uno) allora commuterà l'elemento. Penso che tu stia pensando troppo a questo.
prodigi il

3
solo per dire che è frustrante che le persone dicano "perché mai dovresti volerlo fare?" quando cerco di farlo adesso. Il problema con hasClass è che restituisce True se QUALSIASI elemento che corrisponde al selettore ha la classe data. Quindi, dove ho molte p con la classe "torta" e nomi di classi aggiuntivi per ciascuna ("uno", "due" ecc.) Ho un problema. Voglio selezionare l'insieme generale di p.cake e quindi avere un condizionale (se class = "one" - $ var = 23 - ecc.). Il punto è che sto cercando di passare una $ var diversa a seconda del nome della classe aggiuntiva. Sto cercando di non dover ripetere tutto o
Stella

Risposte:


171

È possibile inserire tale logica nel selettore combinando più selettori . Ad esempio, potremmo indirizzare tutti gli elementi con un dato id, che hanno anche una particolare classe:

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

Dovrebbe essere simile a qualcosa che scriveresti in CSS. Nota che non si applicherà a tutti gli #fooelementi (anche se dovrebbe essercene solo uno) e non si applicherà a tutti gli .barelementi (anche se potrebbero essercene molti). Farà riferimento solo agli elementi che si qualificano su entrambi gli attributi.

jQuery ha anche un ottimo .ismetodo che ti consente di determinare se un elemento ha determinate qualità. Puoi testare una raccolta jQuery su un selettore di stringhe, un elemento HTML o un altro oggetto jQuery. In questo caso, lo controlleremo solo con un selettore di stringhe:

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

32
+1 per is(). Dovrebbe esserci un .hasId()selettore solo perché sembra un partner ovvio per .hasClass()davvero ...
Matt Fletcher

43

Probabilmente userei $('.mydiv').is('#foo');Detto questo se conosci l'Id, perché non dovresti applicarlo al selettore in primo luogo?


17
Forse il codice sta entrando in una funzione di callback che deve gestire un determinato caso in modo diverso. Quindi, alla funzione viene passato automaticamente un oggetto jQuery con attributi sconosciuti. In questo caso, $ ('la tua risposta'). È ('utile');
Peter G

1
Posso pensare a una serie di ragioni. Cosa succede se desideri applicare un'impostazione specifica per dispositivi mobili, ad esempio se un elemento ha id = "mobile". Il perché non è importante.
Posizionabile il

Bene, solo 1 elemento dovrebbe mai avere un dato, idaltrimenti dovrebbe essere un altro attributo ... Suppongo che se la posizione strutturale dell'elemento in questione cambia in base alla pagina o al client / agente utente, allora ok, ma a parte questo .. .
prodigital il

19

aggiornamento: scusa ho capito male la domanda, .has()risposta rimossa .

un altro modo alternativo, creare .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
Scusa ma penso che tu abbia interpretato male la domanda: l' API has () segnala questo: Riduci l'insieme di elementi corrispondenti a quelli che hanno un discendente che corrisponde al selettore o all'elemento DOM. L'OP sta chiedendo come verificare se l'elemento con classe "myDiv" ha anche l'Id foo, mentre has () cercherà discendenti di "myDiv" con Id "foo".
Inclinazione

7

Supponiamo che tu stia iterando attraverso alcuni oggetti DOM e desideri trovare e catturare un elemento con un certo ID

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

Puoi scrivere qualcosa come trovare

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

Nota che se dovessi usare un selettore di classe, il metodo find restituirà tutti gli elementi corrispondenti.

oppure potresti scrivere una funzione di iterazione che farà un lavoro più avanzato

<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
});

Lo stesso codice potrebbe essere facilmente modificato per il selettore di 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
});

Sono contento che tu abbia risolto il tuo problema con index (), qualunque cosa funzioni per te. Spero che questo possa aiutare altri con lo stesso problema. Saluti :)


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

l'uno non è necessario perché non ce ne sarà mai più di uno #theMysteryId.
Prodigital il

2
Bene, ti risparmia la fatica di assegnarlo a una variabile, controllando per vedere se la lunghezza non è vuota e quindi procedendo con il codice. Se il selettore non corrisponde a nulla, jQuery non chiamerà la funzione "each", quindi è bello e pulito. Ora, se tutto ciò che vuoi fare è chiamare alcune API jQuery, allora certo.
Pointy

4

Solo per dire che alla fine ho risolto questo problema usando index ().

NIENTE altro sembrava funzionare.

Quindi, per gli elementi di pari livello, questo è un buon modo per aggirare il problema se si seleziona prima da una classe comune e poi si desidera modificare qualcosa di diverso per ciascuno specifico.

EDIT: per coloro che non conoscono (come me) index () fornisce un valore di indice per ogni elemento che corrisponde al selettore, contando da 0, a seconda del loro ordine nel DOM. Finché sai quanti elementi ci sono con class = "foo" non hai bisogno di un id.

Ovviamente questo non sempre aiuta, ma qualcuno potrebbe trovarlo utile.



1

Puoi anche verificare se l'elemento id viene utilizzato in questo modo:

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

Uso questo metodo per le tabelle dati globali e le tabelle dati ordinate specifiche


l'indefinito dovrebbe essere tra virgolette per funzionare in questo modo 'indefinito'
Leone
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.