Jquery wählt alle Elemente aus, die $ jquery.data () haben.


Antworten:


98

Du könntest es tun

$('[data-myAttr!=""]'); 

Dadurch werden alle Elemente ausgewählt, deren Attribut data-myAttrungleich '' ist (es muss also festgelegt worden sein).

Sie können auch filter () verwenden

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

67
Oder einfach:$('[data-myAttr]')
andlrc

4
Dachte das gleiche. Es funktioniert nicht wie erwartet. siehe diese DEMO
Gdoron unterstützt Monica

Ein Abschluss 'fehlt im ersten Code (kann die Antwort nicht direkt bearbeiten)
Florent2

1
$ ('[data-myAttr! = ""]'); gibt Elemente zurück, denen es nicht zugewiesen wurde. Der Kommentar von @NULL erhält nur Elemente, für die er festgelegt wurde.
Arleslie

6
FALSCH! richtige Lösung: $ ('[data-myAttr]') - Erklärung siehe unten
BassMHL

73

Der beste und einfachste Weg, sie auszuwählen, ist:

$('[data-myAttr]')

Mehr Informationen:

Ich habe viele Dinge getestet.

Die Verwendung $('[data-myAttr!=""]')funktioniert nicht in allen Fällen. Weil Elemente, die keine data-myAttrMenge haben, data-myAttrgleich undefinedund sind$('[data-myAttr!=""]') auch diese auswählen, was falsch ist.


3
Dies funktioniert nur mit Datenattributen, die im Markup definiert sind. Es funktioniert NICHT mit Datenattributen
Sophivorus

19

Sie können filter () verwenden :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});


1
Warum macht die Attributauswahl den Job nicht? $('[data-myAttr]')?
Gdoron unterstützt Monica

6
@gdoron, das liegt daran, dass das data()Getter-Formular zwar die HTML5- data-Attribute liest, das Setter-Formular sie jedoch weder erstellt noch aktualisiert.
Frédéric Hamidi

ähm, wo werden die Daten gespeichert? Kannst du mir eine Referenz geben? Ich habe dies gelesen "(alle Datenwerte werden dann intern in jQuery gespeichert)." aber wo???
Gdoron unterstützt Monica

3
@gdoron, die Daten bleiben in einem globalen Cache erhalten, der durch eine ID verschlüsselt ist, die dem Element über eine expando-Eigenschaft zugeordnet ist.
Frédéric Hamidi


7

Sie können die JQuery-Benutzeroberfläche mit dem Selektor: data () verwenden

Wählt Elemente aus, deren Daten unter dem angegebenen Schlüssel gespeichert sind.

Überprüfen Sie diese jsfiddle für ein Beispiel

Um alle passenden Elemente zu erhalten .data('myAttr'), können Sie verwenden

var matches = $(':data(myAttr)');

Dies sollte sowohl für Elemente mit data-Attributen als auch für Elemente mit Daten funktionieren, die mit $.data()weil gespeichert wurden

Ab jQuery 1.4.3 werden HTML 5-Datenattribute automatisch in das Datenobjekt von jQuery gezogen.

Das funktioniert aber nicht sehr gut. Überprüfen Sie diese jsfiddle und Sie werden sehen, dass der Selektor beim zweiten Aufruf mit 2 Elementen übereinstimmen sollte und nur mit einem übereinstimmt. Dies liegt an einem "Fehler" in der jquery-ui-Bibliothek.

Dies wird aus der Kerndatei jquery-ui übernommen.

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

Wie Sie sehen, werden sie $.data(elem, match)stattdessen verwendet $(elem).data(match), wodurch der Cache nicht aktualisiert wird, wenn Sie Elemente mit data-Attributen anfordern . Wenn das Element getestet wurdedata() Speicherung funktioniert dies gut, aber wenn nicht, wird es nicht in die resultierenden Übereinstimmungen aufgenommen.

Dies ist möglicherweise überhaupt kein Fehler, wenn Sie nur Elemente mit den von Ihnen festgelegten Dateninformationen abgleichen möchten. Andernfalls stehen Ihnen zwei Optionen zur Verfügung.

  1. Verwenden Sie nicht jquery-ui und erweitern Sie Ihren eigenen Pseudo-Selektor $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });

  2. Verwenden Sie jquery-ui mit dem :dataPseudoselector und fügen Sie die Ergebnisse der Auswahl hinzu [data-myAttr], um diejenigen einzuschließen , die möglicherweise übersprungen werden

    var matches = $(':data(myAttr)', '[data-myAttr]')


Dies war Teil der Lösung für mein Problem, Elemente mit Daten- * Attributen auszuwählen, ohne die tatsächliche ID oder den Namen der Datenattribute zu kennen. Ich habe den Weg gefunden, jQuery zu erweitern, um dies anderswo zu tun, aber +1 hier, damit das Code-Snippet die praktische Anwendung zeigt. Andere geben gerade genug Hinweise, aber manchmal müssen Sie ZEIGEN, wie die bereitgestellten Informationen verwendet werden. Vielen Dank! :)
Brandon Elliott

7
$('[data-myAttr]').each(function() {
       var element = $(this);
       // Do something with the element
});

2

Wählen Sie Elemente aus, mit denen ich zuvor festgelegt habe jquery.data();


Die Frage ist, alle Elemente mit einem bestimmten Schlüssel und keine Daten zu finden.


Versuchen Sie es mit jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


Vielen Dank für die Antwort. Die Frage besteht darin, alle Elemente mit einem bestimmten Schlüssel und keine Daten zu finden.
Argiropoulos Stavros

@ArgiropoulosStavros Müssen Elemente zurückgegeben werden, für die sowohl ein html data-*Attribut als auch ein jQuery.data()Satz festgelegt wurde?
guest271314
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.