Jquery chọn tất cả các phần tử có $ jquery.data ()


96

Chọn các phần tử mà tôi đã đặt trước đó jquery.data();

tức là Chọn tất cả các phần tử .data('myAttr')đã được thiết lập.

GIẢI PHÁP

Một jsfiddle để giảm tốc độ là Fiddle

Câu trả lời:


98

Bạn có thể làm

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

điều này chọn tất cả các phần tử có thuộc tính data-myAttrkhông bằng '' (vì vậy nó phải được đặt);

bạn cũng có thể sử dụng bộ lọc ()

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

67
Hoặc chỉ:$('[data-myAttr]')
andlrc

4
Cũng nghĩ như vậy. Nó không hoạt động như mong đợi. thấy này DEMO
gdoron đang hỗ trợ Monica

thiếu một đóng 'trong đoạn mã đầu tiên (không thể chỉnh sửa câu trả lời trực tiếp)
Florent2

1
$ ('[data-myAttr! = ""]'); sẽ trả về các phần tử không được gán nó. Nhận xét của @NULL chỉ nhận được các phần tử đã đặt nó.
arleslie

6
SAI LẦM! giải pháp đúng: $ ( '[dữ liệu myAttr]') - xem câu trả lời dưới đây để giải thích
BassMHL

74

Cách tốt nhất và đơn giản để chọn chúng là:

$('[data-myAttr]')

Thêm thông tin:

Tôi đã thử nghiệm rất nhiều thứ.

Sử dụng $('[data-myAttr!=""]')không hoạt động cho mọi trường hợp. Bởi vì các phần tử không có data-myAttrtập hợp, sẽ có giá trị data-myAttrbằng undefined$('[data-myAttr!=""]')cũng sẽ chọn những phần tử đó, điều này không chính xác.


3
Điều này chỉ hoạt động với các thuộc tính dữ liệu được xác định trong đánh dấu. Nó không làm việc với các dữ liệu thuộc tính được xác định thông qua jQuery, xem jsfiddle.net/2p7h0Lj8/1
Sophivorus

19

Bạn có thể sử dụng filter () :

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

1
Đã chuẩn bị đăng bài này, đây là một trò đùa để cho thấy nó hoạt động: jsfiddle.net/gbHFZ/1
Rory McCrossan

1
Tại sao bộ chọn thuộc tính không thực hiện công việc? $('[data-myAttr]')?
gdoron đang hỗ trợ Monica 29/02/12

6
@gdoron, đó là bởi vì data()biểu mẫu getter của thực sự đọc các data-thuộc tính HTML5 , nhưng biểu mẫu setter của nó không tạo cũng như cập nhật chúng.
Frédéric Hamidi

ummm, vậy nó lưu dữ liệu ở đâu? bạn có thể cho tôi một tài liệu tham khảo? Tôi đọc cái này "(tất cả các giá trị dữ liệu sau đó được lưu trữ nội bộ trong jQuery)." nhưng ở đâu???
gdoron đang hỗ trợ Monica 29/02/12

3
@gdoron, dữ liệu được lưu giữ trong bộ nhớ cache toàn cầu, được khóa bởi một id được liên kết với phần tử thông qua thuộc tính expando.
Frédéric Hamidi


7

Bạn có thể sử dụng giao diện người dùng JQuery với bộ chọn : data ()

Chọn các phần tử có dữ liệu được lưu trữ theo khóa được chỉ định.

Kiểm tra jsfiddle này để biết ví dụ

Để có được tất cả các phần tử phù hợp, .data('myAttr')bạn có thể sử dụng

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

Điều này sẽ làm việc cho cả hai yếu tố với data-các thuộc tính và các yếu tố với các dữ liệu được lưu trữ sử dụng $.data()

Kể từ jQuery 1.4.3, các thuộc tính dữ liệu HTML 5 sẽ được tự động kéo vào đối tượng dữ liệu của jQuery.

Nhưng điều này không hoạt động rất tốt. Kiểm tra jsfiddle này và bạn sẽ thấy rằng lần thứ hai bộ chọn được gọi, nó sẽ khớp với 2 phần tử và chỉ khớp với một phần tử. Điều này là do "một lỗi" trong thư viện jquery-ui.

Điều này được lấy từ tệp jquery-ui cốt lõi.

 $.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 ] );
        }
});

Như bạn có thể thấy, họ đang sử dụng $.data(elem, match)thay thế $(elem).data(match), điều này khiến bộ nhớ cache không được cập nhật trong trường hợp bạn đang yêu cầu các phần tử có data-thuộc tính. Nếu phần tử đã được kiểm tra khả năng data()lưu trữ, phần tử này hoạt động tốt nhưng nếu không, phần tử này sẽ không được đưa vào các kết quả phù hợp.

Đây có thể không phải là một lỗi nếu những gì bạn muốn là chỉ khớp các phần tử với thông tin dữ liệu do bạn thiết lập nhưng nếu không, bạn chỉ có hai tùy chọn.

  1. Không sử dụng jquery-ui và mở rộng bộ chọn giả của riêng bạn $(: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. Sử dụng jquery-ui với trình :datadò giả và nối kết quả của việc chọn [data-myAttr]để bao gồm những kết quả có thể bị bỏ qua

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


Đây là một phần của giải pháp cho vấn đề của tôi khi chọn các phần tử có thuộc tính data- * mà không biết id thực tế hoặc tên thuộc tính dữ liệu. Tôi đã tìm thấy cách để mở rộng jQuery để thực hiện việc này, ở nơi khác, nhưng +1 ở đây để đoạn mã hiển thị ứng dụng thực tế. Những người khác cung cấp chỉ đủ để gợi ý, nhưng đôi khi bạn cần HIỂN THỊ cách SỬ DỤNG thông tin được cung cấp. Cảm ơn! :)
Brandon Elliott

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

2

Chọn các phần tử mà tôi đã đặt trước đó jquery.data();


Câu hỏi dành cho việc tìm kiếm tất cả các phần tử bằng một khóa cụ thể chứ không phải bất kỳ dữ liệu nào.


Hãy thử sử dụng 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/


Cảm ơn câu trả lời. Câu hỏi dành cho việc tìm kiếm tất cả các phần tử bằng một khóa cụ thể chứ không phải bất kỳ dữ liệu nào.
Argiropoulos Stavros

@ArgiropoulosStavros Có yêu cầu trả về các phần tử có html data-*bộ thuộc tính cũng như jQuery.data()bộ không?
271314
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.