Ich muss Elemente basierend auf Werten auswählen, die im .data()
Objekt eines Elements gespeichert sind . Zumindest möchte ich Dateneigenschaften der obersten Ebene mithilfe von Selektoren auswählen, möglicherweise wie folgt:
$('a').data("category","music");
$('a:data(category=music)');
Oder vielleicht hat der Selektor das reguläre Attribut-Selektor-Format:
$('a[category=music]');
Oder im Attributformat, aber mit einem Bezeichner, der angibt, dass es sich um Folgendes handelt .data()
:
$('a[:category=music]');
Ich habe festgestellt, dass die Implementierung von James Padolsey einfach und dennoch gut aussieht. Die Auswahlformate über den auf dieser Seite gezeigten Spiegelmethoden. Es gibt auch diesen Sizzle-Patch .
Aus irgendeinem Grund erinnere ich mich, dass ich vor einiger Zeit gelesen habe, dass jQuery 1.4 Selektoren für Werte im jquery- .data()
Objekt unterstützen würde. Jetzt, wo ich danach suche, kann ich es jedoch nicht finden. Vielleicht war es nur eine Feature-Anfrage, die ich gesehen habe. Gibt es Unterstützung dafür und ich sehe es einfach nicht?
Im Idealfall möchte ich Untereigenschaften in data () mithilfe der Punktnotation unterstützen. So was:
$('a').data("user",{name: {first:"Tom",last:"Smith"},username: "tomsmith"});
$('a[:user.name.first=Tom]');
Ich möchte auch mehrere Datenselektoren unterstützen, bei denen nur Elemente mit ALLEN angegebenen Datenselektoren gefunden werden. Der reguläre JQuery Multiple Selector führt eine ODER-Verknüpfung aus. Zum Beispiel $('a.big, a.small')
wählt a
Tags mit jeder Klasse big
oder small
). Ich suche ein UND, vielleicht so:
$('a').data("artist",{id: 3281, name: "Madonna"});
$('a').data("category","music");
$('a[:category=music && :artist.name=Madonna]');
Schließlich wäre es großartig, wenn Vergleichsoperatoren und Regex-Funktionen für Datenselektoren verfügbar wären. Wäre $(a[:artist.id>5000])
also möglich. Mir ist klar, dass ich wahrscheinlich viel davon tun könnte filter()
, aber es wäre schön, ein einfaches Auswahlformat zu haben.
Welche Lösungen stehen dafür zur Verfügung? Ist James Padolsey derzeit die beste Lösung? Mein Anliegen ist in erster Linie die Leistung, aber auch die zusätzlichen Funktionen wie die Notation von Sub-Property-Punkten und mehrere Datenselektoren. Gibt es andere Implementierungen, die diese Dinge unterstützen oder in irgendeiner Weise besser sind?
quelle
Antworten:
Ich habe einen neuen
data
Selektor erstellt, mit dem Sie verschachtelte Abfragen und UND-Bedingungen ausführen können. Verwendung:Das Muster ist:
"operator" und "check" sind optional. Wenn Sie es also nur haben
:data(a.b.c)
, wird es einfach auf die Richtigkeit von überprüfta.b.c
.Sie können die verfügbaren Operatoren im folgenden Code sehen. Unter anderem
~=
können Regex-Tests durchgeführt werden:Ich habe es mit ein paar Variationen getestet und es scheint ziemlich gut zu funktionieren. Ich werde dies wahrscheinlich bald als Github-Repo hinzufügen (mit einer vollständigen Testsuite), also pass auf!
Der Code:
quelle
$("a:data(condition),a:data(orCondition)")
... es hat den gleichen Effekt. Je mehr Funktionen Sie hinzufügen, desto langsamer wird es. Wenn die Logik komplex ist, verwenden Sie$(foo).filter(function(){...})
.jQuery.data
, bei der die in den HTML5-Attributen definierten Daten nicht abgerufen werden. Wenn Sie diese Funktionalität möchten, können Sie ändernjQuery.data
zu$('selector').data
, aber das ist ein Trade - off für die Geschwindigkeit.Im Moment wähle ich so aus:
Das scheint gut zu funktionieren, aber es wäre schön, wenn jQuery nach diesem Attribut ohne das Präfix 'data-' auswählen könnte.
Ich habe dies nicht mit Daten getestet, die über jQuery dynamisch zu Elementen hinzugefügt wurden, sodass dies der Nachteil dieser Methode sein könnte.
quelle
Sie können auch eine einfache Filterfunktion ohne Plugins verwenden. Dies ist nicht genau das, was Sie wollen, aber das Ergebnis ist das gleiche:
quelle
filter
Traversal-Funktion eine Testfunktion akzeptieren kann =) dankeIch möchte Sie warnen, dass
$('a[data-attribute=true]')
dies laut Ashleys Antwort nicht funktioniert, wenn Sie Daten über die Funktion data () an ein DOM-Element angehängt haben.Es funktioniert wie erwartet, wenn Sie Ihrem HTML-Code einen tatsächlichen Datenattr hinzugefügt haben, aber jQuery speichert die Daten im Speicher, sodass die Ergebnisse, die Sie erhalten
$('a[data-attribute=true]')
, nicht korrekt sind.Sie müssen das Daten-Plugin http://code.google.com/p/jquerypluginsblog/ verwenden , die
filter
Lösung von Dmitri verwenden oder alle Elemente mit $ .each überprüfen und iterativ .data () überprüfenquelle
Es gibt ein
:data()
Filter-Plugin , das genau das tut :)Einige Beispiele basierend auf Ihrer Frage:
Die Leistung wird im Vergleich zu dem, was möglich ist , nicht besonders gut sein. Die Auswahl
$._cache
und das Ergreifen der entsprechenden Elemente ist bei weitem die schnellste, aber viel runder und nicht sehr "jQuery-ey" in Bezug auf die Art und Weise, wie Sie dazu kommen Sachen (du kommst normalerweise von der Elementseite herein). Ich bin mir nicht sicher, ob dies sowieso am schnellsten ist, da der Prozess des Übergangs von der eindeutigen ID zum Element in Bezug auf die Leistung in sich selbst verwickelt ist.Der von Ihnen erwähnte Vergleichswähler eignet sich am besten
.filter()
für a. Das Plugin bietet keine integrierte Unterstützung dafür, obwohl Sie ihn ohne großen Aufwand hinzufügen können.quelle
data-*
Attributen und deren Auswahl schneller ist als die Auswahl von.data()
Eigenschaften? Gibt es auch eine Idee, wo ich mehr über $ ._ Cache erfahren kann? Ich habe danach gegoogelt, finde aber nicht viel.$.cache
nicht$._cache
, Sie können hier sehen, wie es in jQuery Core implementiert und verwendet wird: github.com/jquery/jquery/blob/master/src/data.js#L4 Wenn Sie es aufrufen, wird.data()
es tatsächlich als Objekt gespeichert in$.cache[elementUniqueID]
, eine ID, die jedem Element nach Bedarf schrittweise zugewiesen wird, z. B. 1, 2, 3 usw. Diese Kletter-ID wird in jQuery 1.4.3 angezeigt, glaube ich, basierend auf den Git-Kommentaren des anderen Tages. Ich würde davon ausgehen, dass die HTML 5-Route schneller ist, abhängig davon, welche Browseroptimierungen verfügbar sind (ich bin sicher, dass weitere verfügbar sein werden).Sie können ein
data-*
Attribut für eine Ulme festlegenattr()
und dann mit diesem Attribut auswählen:und jetzt für diese Ulme, beide
attr()
unddata()
wird 123 ergeben :Wenn Sie jedoch den Wert so ändern, dass er 456 verwendet
attr()
,data()
wird weiterhin 123 angezeigt :So wie ich es verstehe, sollten Sie sich wahrscheinlich von Vermischungen
attr()
unddata()
Befehlen in Ihrem Code fernhalten, wenn Sie dies nicht müssen. Dennattr()
scheint direkt mit dem DOM zu korrespondieren, während esdata()
mit dem 'Speicher' interagiert, obwohl sein Anfangswert vom DOM stammen kann. Der entscheidende Punkt ist jedoch, dass die beiden nicht unbedingt synchron sind.Also sei einfach vorsichtig.
Wenn Sie das
data-*
Attribut im DOM oder im Speicher nicht ändern, haben Sie auf keinen Fall ein Problem. Sobald Sie anfangen, Werte zu ändern, können potenzielle Probleme auftreten.Vielen Dank an @Clarence Liu für die Antwort von @ Ash sowie für diesen Beitrag .
quelle
Es klappt. Siehe Attribut gleich Selektor [Name = ”Wert”] .
quelle
Wenn Sie auch jQueryUI verwenden, erhalten Sie eine (einfache) Version des
:data
Selektors, die das Vorhandensein eines Datenelements überprüft, sodass Sie so etwas wie$("div:data(view)")
oder ausführen können$( this ).closest(":data(view)")
.Siehe http://api.jqueryui.com/data-selector/ . Ich weiß nicht, wie lange sie es schon haben, aber es ist jetzt da!
quelle
Hier ist ein Plugin, das das Leben vereinfacht: https://github.com/rootical/jQueryDataSelector
Verwenden Sie es so:
quelle