2011-01-03 18 views
1

Schnelle Frage - Ist es möglich, jQuery-Selektoren zu erweitern, um die Ergebnismenge (z. B.) über Traversal zu ändern, anstatt nur eine vorhandene Menge zu filtern?Benutzerdefinierter jQuery-Selektor

Um zu klären - ich die Wahl äquivalent einen Anruf zu $.filter() nicht wollen - ich mag etwas näher an $('foo:nth-child(n)') oder $('foo:eq(n)'), wo ich genau angeben kann, welche Elemente durch den Wähler zurückgeführt werden. Irgendwelche Gedanken würden geschätzt werden.

Edit: hier ist ein Beispiel dessen, was ich umsetzen wollen:

$.expr[':']['nth-parent'] = function(deTarget, iIndex, aProperties, aStack) { 
    var iN, $currentElement; 

    if(!deTarget) 
     return; 
    if(!aProperties || aProperties.length < 4 || isNaN(iN = parseInt(aProperties[3])) || iN < 0) 
     throw('jQuery.nth-parent(N) requires a non-negative integer argument'); 

    $currentElement = $(deTarget); 
    while(--iN >= 0) 
     $currentElement = $currentElement.parent(); 

    aStack = $currentElement.length ? [$currentElement.get(0)] : []; 
    return aStack.length ? true : false; 
}; 

Also, schließlich würde ich wollen, dass die neue aStack Array als Ergebnis zurückgegeben, in diesem speziellen Fall.

+1

Ja, Sie können die Selektoren erweitern, Sie müssen Beispiele für die Auswahl angeben, damit wir Ihnen zeigen können, wie. – zzzzBov

+0

"Ich möchte etwas näher an $ ('foo: nth-child (n)') oder $ ('foo: eq (n)')" - warum nicht einfach diese verwenden? – hunter

Antwort

1

Ja, Sie können dies tun, hier ein gutes Beispiel wäre, was Sie nach in der Frage sind, ist hier, wie :eq() implementiert:

jQuery[":"].eq = function(elem, i, match) { 
    return match[3] - 0 === i; 
}; 

Die Signatur einen weiteren Parameter hat, stack, wie folgt aus:

function(elem, index, match, stack) 

stack ist der Satz von alle Elemente, wenn Sie das brauchen in Ihrer Filterung zu verwenden.

+0

Hey Nick - Ich denke ich lag falsch mit 'eq'; Sie können diese Informationen basierend auf dem aktuellen Selektorkontext abrufen. Ich möchte Elemente aus diesem Kontext zurückgeben. Sehen Sie sich das aktualisierte Snippet in der Frage an. – mway

+1

@mway - Ich denke du hast deine Selektoren rückwärts, du kletterst auf * get * das 'n-te Elternteil()', das ist besser als Funktion gemacht, Selektoren sind * für das aktuelle Element *.Zum Beispiel '' nth-child() 'Selektoren Elemente, die * das' n-te Kind 'sind, nicht das * haben * 'n-Kinder', das wäre rückwärts von, wie CSS Selektoren insgesamt arbeiten. –

+0

Ah ja, das war ein bisschen weniger über CSS und mehr über die Bereitstellung eines Convenience-Selektors zum Überqueren des Baumes. – mway

1

sollten Dieser Link Ihnen helfen, was Sie brauchen: http://jquery-howto.blogspot.com/2009/06/custom-jquery-selectors.html

Aber um Ihre Frage zu beantworten, ja ist es möglich, benutzerdefinierte Selektoren zu erstellen.

+0

Nein - diese Seite zeigt Ihnen, wie Sie die aktuelle Ergebnismenge mit einem Selektor filtern können, z. B. "jedes Element, das ein rel-Attribut hat" (in Bezug auf diese Seite). Ich möchte die gefundenen Elemente (über die Traversierung) mit dem Selektor - nicht Filter - durchlaufen und zurückgeben. – mway

+0

Ok vielleicht verstehe ich dann nicht. Können Sie einen Pseudocode angeben, nach dem Sie genau suchen? – spinon

+0

Werfen Sie einen Blick auf die aktualisierte Frage - vielleicht wird das zur Klärung beitragen ... Entschuldigung für die Verwirrung! – mway

1

Ich glaube, Sie meinen Sie einen eigenen Selektor mit einem Parameter wollen:

$.expr[':'].heightAbove = function(obj, idx, meta, stack) { 
    return ($(this).height() > parseInt(meta, 10)); 
}; 

Sie können dies dann rufen als

$('div:heightAbove(40)'); 

divs oben 40px mit einer Höhe auszuwählen.

Verwandte Themen