2012-04-15 12 views
15

Ich arbeite daran, eine semantische Methode für die Suche nach Elementen mit jQuery zu erstellen. Mit $("#element").length > 0 fühlt sich einfach nicht wirklich sehr gut zu mir gefasst, so dass ich meine eigenen Wähler zusätzlich für den Einsatz in .is machen:Rückgabe "True" auf leeren jQuery Selector Array?

if($("#element").is(":present")) { 
    console.log("It's aliiiveeee!!"); 
} 

Dieser Teil war einfach, wie folgt aus:

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length > 0; 
    } 
}); 

ich möchte noch einen Schritt weiter gehen, und macht es einfach, zu sehen, ob ein Element nicht existiert, unter Verwendung ähnliche Syntax:

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length > 0; 
    }, 
    absent: function(a) { 
     return $(a).length === 0; 
    } 
}); 

$(function() { 
    if($("#element").is(":absent")) { 
    console.log("He's dead, Jim."); 
    } 
}); 

Aber dieser Teil ist überraschend schwer zu tun. Ich denke, das liegt daran, dass ich die zurückgegebenen Elemente reduziere, um ein Ergebnis zu erhalten, und den Selektor auf .lenge === 0 zu setzen, ist dasselbe wie die Frage nach keinen Elementen: Er gibt false zurück, egal was passiert.

ich viele verschiedene Weisen versucht haben, die Dinge zu ändern und dies wahr zurück zu bekommen, wenn das Element nicht vorhanden ist, und falsch, wenn es tut:

return $(a).length === 0; 

return !($(a).length > 0); 

if(!($(a).length > 0)) { 
    return true; 
} 

if($(a).length > 0) { 
    return false; 
} else { 
    return true; 
} 

return !!($(a).length === 0); 

// etc... 

Gibt es eine einfache Möglichkeit, Erhalten Sie das, um nur wahr zurückzugeben, wenn das Element nicht existiert, und falsch, wenn es das tut?

Antwort

14

Die Definition von is:

Prüfen der Strom aufeinander abgestimmten Satz von Elementen gegen einen Selektor, Element oder Objekt jQuery und true zurück, wenn mindestens eines dieser Elemente die angegebenen Argumente entspricht.

Das Problem ist, dass, da Sie keine Elemente haben, es nicht möglich ist, dass eines Ihrer Elemente eine Bedingung erfüllt. jQuery ruft nicht einmal Ihren Code auf, da keine Elemente vorhanden sind.

BEARBEITEN: Um etwas zu verdeutlichen, wird Ihr Code einmal für jedes Element in Ihrem Objekt aufgerufen (zumindest bis eines wahr ist). Keine Elemente bedeutet, dass der Code nie aufgerufen wird. a in Ihrem Code ist immer ein einzelnes Element.

EDIT2: Das mit im Auge, wäre dies eine effizientere Implementierung von present sein:

$.extend($.expr[':'],{ 
    present: function(a) { 
     return true; 
    } 
}); 
+0

Also, '.is' ist nicht wirklich für die Rückgabe von True entworfen, wenn keine Elemente in den übereinstimmenden Selektoren vorhanden sind? Eine andere Option, die ich in Erwägung gezogen hatte, war: 'if ($ (" # element "). Is (": not (: present) ")) { console.log (" Er ist tot, Jim. "); } ' Aber seltsamerweise funktioniert das auch nicht. –

+1

@Code Junkie: Auch hier haben Sie keine Elemente, die '.is()' mit verwenden, so dass die Funktion einfach nicht aufgerufen wird. Egal, welchen Selektor Sie werfen, nichts wird passieren! – BoltClock

+0

Also gibt es möglicherweise keine Möglichkeit, bei einem leeren Selektorergebnis true zurückzugeben? –

1

0 ist "falsy" in JavaScript.

Sie können einfach !$(a).length zurückgeben.

+4

Während das wahr ist, Sie alles, was Sie wollen es setzen kann, wird der Code nicht ausgeführt werden, wenn es keine Elemente sind. –

0

Wie wäre:

if (!$(a)[0]) { 
    // $(a) is empty 
} 

So $(a)[0] das erste Element in dem Objekt jQuery abruft. Wenn dieses Element null/nicht definiert ist, bedeutet dies, dass das jQuery-Objekt leer ist.

5

Sie einfach

if(​$('element').length) // 1 or 0 will be returned 

oder

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length; 
    } 
}); 

if($('#element').is(':present')) 
{ 
    // code for existence 
} 
else 
{ 
    // code for non-existence 
} 

Example verwenden können .

2

Vorausgesetzt, dass $().is() nicht einmal ausgeführt wird, wenn die Sammlung leer ist, ist der :present Selektor eher überflüssig. Anstatt also mit $.expr[':'] spielen, würde ich gehen mit $.fn erstreckt entsprechender Funktion enthalten, zB:

$.fn.extend({ 
    hasAny: function() { 
     return this.length > 0; 
    }, 
}); 

oder

$.fn.extend({ 
    isEmpty: function() { 
     return this.length == 0; 
    }, 
}); 

Der Grund, warum ich persönlich mit diesem Ansatz gehen würde, ist, dass Wähler sind in der Regel verwendet, um bestimmte Eigenschaften von Elementen zu überprüfen (vergleiche :checked, :enabled, :selected, :hover, etc.), nicht die Eigenschaften von jQuery Element als Ganzes gesetzt (zB .size(), .index()).

Verbrauch würde natürlich wie folgt aus:

if ($('#element').isEmpty()) 
    console.log("He's dead, Jim."); 
+0

Ja, das ist wahrscheinlich letztendlich ein besserer Weg. Ich spielte meistens mit allen Optionen herum, um zu sehen, was der beste Weg wäre. Ich werde als nächstes mit diesem spielen. ^^ –