JQuery trova il primo elemento genitore con un prefisso di classe specifico


124

Voglio ottenere il primo genitore che ha un prefisso di classe specifico, supponiamo:

<div class="div-a3332"> 
  <div class="div-a89892">
    <p>
      <div class="div-b2">
        <div id="divid">hi</div>
      </div>
    </p>
  </div>
</div>

Ad esempio, il mio elemento corrente è #divide voglio trovare il primo elemento che ha il prefisso di classe div-a. Quindi in pratica selezionerà:

<div class="div-a89892">

6
Fermare. Usa più classi, invece di combinare le informazioni in una sola classe. Il selettore di "corrispondenza" è lento e questo design non scala per eventuali modifiche. <div class='a'>, quindi fornisci regole per div.a. Non so affatto perché stai inserendo divil nome della classe, in realtà.
Stefan Kendall

2
Tuttavia, non unire i dati in prefissi di classe. Questo è un modello terribile ed è facilmente risolvibile con più classi.
Stefan Kendall

17
@StefanKendall: A volte hai a che fare con la schifezza di terze parti di altri, ea volte stai supportando app legacy che non puoi risolvere rapidamente. Il cattivo design è un dato di fatto, e questa è una domanda perfettamente legittima.
Nerdmaster

Risposte:


222

Utilizzare .closest()con un selettore:

var $div = $('#divid').closest('div[class^="div-a"]');

A proposito, non ho idea del motivo per cui questo è stato downvoted Il selettore di classe-prefix è fragile, ma sarà funzionerà.
Matt Ball

Per OP: assicurati che l'elemento che stai cercando sia un genitore da qualche parte nell'albero DOM e non un fratello o simile all'oggetto che stai cercando (come da documentazione). Non è "il più vicino da nessuna parte nel documento" ma "il più vicino lavorando sull'albero DOM".
Christian P.

Non funziona per me. Inoltre, voglio trovare il primo elemento che ha un prefisso specifico, che non deve essere un elemento div.
Viaggio nel tempo

@Time quindi rimuovere il divselettore di elementi: $('#divid').closest('[class^="div-a"]'). Come ha commentato @Stefan, però, dovresti davvero usare più classi.
Matt Ball

3
Questo selettore richiede una quantità assurda di cicli (ma può comunque essere veloce). Se hai bisogno di supportare IE6, IE7 o IE8, questo può davvero fregarti se il tuo DOM diventa troppo grande; IE visualizza la finestra di dialogo "lo script non risponde" quando viene eseguito un certo numero di istruzioni JS VM, e NON dopo un certo periodo di tempo. Ho visto script che completano in 0,1 ms Internet Explorer in crash proprio per questo motivo.
Stefan Kendall

56

Jquery in seguito ti ha permesso di trovare i genitori con il .parents()metodo.

Quindi consiglio di usare:

var $div = $('#divid').parents('div[class^="div-a"]');

Ciò fornisce tutti i nodi padre che corrispondono al selettore. Per ottenere il primo genitore che corrisponde al selettore usa:

var $div = $('#divid').parents('div[class^="div-a"]').eq(0);

Per altre query di attraversamento DOM simili, controlla la documentazione sull'attraversamento del DOM .


La risposta non è fuorviante, mostra solo un'altra alternativa a .closest (), .parents () sembra più leggibile ed è un'altra soluzione al problema.
Sunny R Gupta

9
Closest è una soluzione migliore di questa in quanto più vicino troverà solo la prima corrispondenza, mentre i genitori troveranno TUTTE le corrispondenze risalendo il DOM. Ovviamente più efficiente da usare più vicino, anche se sono d'accordo, non è la funzione con il nome migliore.
Mog0

1
Abbastanza divertente, ho finito per utilizzare questa soluzione poiché .parentsUtil () non funzionava come mi aspettavo.
Mark Handy
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.