2009-06-29 6 views
60

Sono in procinto di implementare jQuery e rimuovere le librerie di Prototipi nella mia base di codice, e mi chiedo se potresti darmi il modo migliore per implementare questa funzionalità in jQuery. Ho familiarità con la sintassi discendente di jQuery antenato >, ma voglio solo verificare se un elemento è un discendente per vero di falso, come il seguente codice: qualcuno può darmi la soluzione jQuery più efficiente per questo?Il modo migliore per scoprire se l'elemento è un discendente di un altro

<div id="australopithecus"> 
    <div id="homo-herectus"> 
    <div id="homo-sapiens"></div> 
    </div> 
</div> 

$('homo-sapiens').descendantOf('australopithecus'); 
// -> true 

$('homo-herectus').descendantOf('homo-sapiens'); 
// -> false 
+2

vittima: http://stackoverflow.com/questions/865486/how-can-i-check-if-an-element-is-within-another-one-in-jquery/865551 –

+4

Usa ' jQuery.contains() '. Vedi la mia risposta qui sotto. – TLindig

risposta

29

penserei si potrebbe approfittare di selezione di stile CSS qui, con lunghezza restituita. .

$('#australopithecus #homo-sapiens').length // Should be 1 
$('#homo-sapiens #homo-herectus').length // Should be 0 

Non è esattamente vero/falso, ma controllando 0/1 come un valore booleano dovrebbe funzionare. :)

In alternativa, si potrebbe fare qualcosa come $ ('genitore #'). Find ('# figlio') e controllare la lunghezza lì.

+1

grazie per tutte le buone risposte !! non mi rendevo conto che avevo così tante opzioni :) – 29er

+1

Grazie! E puoi "lanciare" questi a 'true' /' false' anteponendo '!!', come '!! $ ('# australopithecus # homo-sapiens'). Length', che restituisce' true'. –

+0

Non c'è bisogno di trasmetterli a qualcos'altro visto che in javascript false, 0, null e NaN sono tutti contati come falsi quando usati in istruzioni if ​​... –

3

Si potrebbe tentare di .find() nella Elementi .children()

$("#lucy").find("#homo-erectus").length; 

o la direzione opposta:

$("#homo-erectus").parents().find("#lucy").length; 
+0

Non conosco la sintassi jQuery, ma sarebbe più rapido controllare i genitori() dell'elemento discendente, piuttosto che tutti i figli dell'antenato, giusto? – harpo

+0

@harpo, Potenzialmente. A seconda degli utenti DOM particolare. Un buon consiglio - sicuramente qualcosa da considerare. – Sampson

21

Come su


$("#homo-herectus").parents().is("#australopithecus"); 
-1
function descendantOf(parentId, childId) { 
    return ($('#'+parentId+' > #'+childId).length === 1); 
} 

Questo dovrebbe funzionare.

Come ricordato nel commento qui sotto, se non si vuole che sia discendenti diretti solo:

function descendantOf(parentId, childId) { 
    return ($('#'+childId, $('#'+parentId)).length === 1); 
} 
+3

L'uso del carattere> nel selettore limiterà il controllo solo ai decenanti della prima generazione. Se vuoi verificare se è un qualsiasi tipo di discendente (al contrario del discendente diretto), rimuovi semplicemente il carattere>. –

5

È possibile utilizzare la funzione is() in questo modo:

alert($('#homo-sapiens').is('#australopithecus *')); 
// -> true 

alert($('#homo-herectus').is('#homo-sapiens *')); 
// -> false 
+4

Non pensi che usare * (asterix) sia troppo costoso perché controlla tutti i bambini senza fermarsi alla prima partita? –

-1

Supponendo di riscrivere la sua dichiarazione iniziale:

$('#homo-sapiens').descendantOf('#australopithecus'); 

cercare di plugin:

(function($) { 
    $.fn.descendantOf = function(parentId) { 
     return this.closest(parentId).length != 0; 
    } 
})(jQuery) 
4
$.fn.descendantOf = function(element) { 
    element = $(element)[0]; 
    var current = this; 
    var body = document.body; 
    while (current && current != element && current != document.body) { 
     current = $(current).parent()[0]; 
    } 
    if (typeof(current) == "undefined" || typeof(current) == "null") { 
     return false; 
    } else if (current == element) { 
     return true; 
    } else if (current == document.body) { 
     return false; 
    } 
} 

Esempio :

<div id="foo"> 
    <div id="bar"> 
     <div id="baz"></div> 
    </div> 
</div> 

E:

$('#foo').descendantOf('#bar'); // false 
$('#foo').descendantOf('#foo'); // false 
$('#foo').descendantOf(document.body); // true 
$('#bar').descendantOf('#foo'); // true 
$('#baz').descendantOf('#foo'); // true 
+0

'typeof' non è una funzione, è una parola chiave. Non hai bisogno di parentesi, anche se è ancora valido.'typeof current ==" undefined "' – SeinopSys

103

In jQuery 1.6, è possibile utilizzare il seguente codice generico, per esempio targetElt e parentElt possono essere entrambi elementi DOM o oggetti jQuery-avvolti, così come i selettori:

$(targetElt).closest(parentElt).length > 0 

Alcune delle altre risposte che richiedono di fare riferimento a elementi dal loro ID, che non è utile se tutto quello che hai è un elemento DOM senza ID.Inoltre, se vuoi assicurarti che targetElt sia un discendente rigoroso di parentElt (in altre parole, non vuoi contare parentElt come discendente proprio), assicurati di aggiungere un controllo targetElt != parentElt prima di chiamare allo .closest(), o utilizzare .parents().find() come suggerisce Jonathan Sampson.

+3

Esattamente quello che volevo sapere, grazie. –

+1

Questa dovrebbe essere la risposta accettata. Tutte le altre risposte in questa domanda e il dup richiedono conoscenze di ID/classi. Questo è perfettamente trasparente a tutto ciò che –

+2

0 è falso in modo da poter usare semplicemente $ (targetElt) .closest (parentElt) .length come condizione. (cioè senza verificare la lunghezza è> 0) – ensignr

2

metodo migliore che ho trovato è usare Dan G. Switzer, il metodo di II trovato qui: http://blog.pengoworks.com/index.cfm/2008/9/24/Using-jQuery-to-determine-if-an-element-is-a-child-of-another-element

jQuery.fn.isChildOf = function(b){ 
    return (this.parents(b).length > 0); 
}; 

allora si sarebbe semplicemente usare il plugin come:

$('homo-sapiens').isChildOf('australopithecus'); 
// -> true 

$('homo-herectus').isChildOf('homo-sapiens'); 
// -> false 
+1

Questo determina solo un singolo livello di discendenza –

+0

@MildFuzz Sono abbastanza sicuro di sbagliarvi. 'parents()' attraversa tutto l'albero per cercare una corrispondenza. https://api.jquery.com/parents/ –

39

con jQuery> = 1.4 (2010) è possibile utilizzare la funzione molto veloce jQuery.contains()

Questo metodo statico funziona con elementi DOM, non con elementi jQuery a nd restituisce true o false.

jQuery.contains(container, descendant) 

Esempio: Per controllare se un elemento è nel documento che si potrebbe fare questo:

jQuery.contains(document.body, myElement) 

Aggiornamento:

C'è anche un metodo DOM nativo Node.contains() che tutti i browser dal ie5 + supporta. Così si può fare senza jQuery:

document.body.contains(myElement) 
+1

Questa è la risposta giusta. – Andy

+0

Puoi usare gli oggetti jQuery estraendo l'elemento DOM dall'oggetto aggiungendo "[0]" -> https://learn.jquery.com/using-jquery-core/faq/how-do-i-pull-a -native-dom-elemento da-un-jquery-oggetto / –

0

Un'alternativa più vicino() che utilizza (quasi) lo stesso principio di traslazione e non include l'elemento stesso: child.parentsUntil(ancestor).last().parent().is(ancestor).

var child = $('#homo-sapiens'); 
var ancestor = $('#australopithecus'); 

console.log(child.parentsUntil(ancestor).last().parent().is(ancestor)); // true 
Problemi correlati