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
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:
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-myAttr
khô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;
});
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-myAttr
tập hợp, sẽ có giá trị data-myAttr
bằng undefined
và $('[data-myAttr!=""]')
cũng sẽ chọn những phần tử đó, điều này không chính xác.
Bạn có thể sử dụng filter () :
var elements = $("*").filter(function() {
return $(this).data("myAttr") !== undefined;
});
$('[data-myAttr]')
?
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.
Bạn có thể sử dụng phần mở rộng jQuery Selector này: Truy vấn dữ liệu phần tử
$(':data'); // All elements with data
$(':not(:data)'); // All elements without data
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()
vì
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.
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]);
}
});
Sử dụng jquery-ui với trình :data
dò 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]')
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/
html
data-*
bộ thuộc tính cũng như jQuery.data()
bộ không?
$('[data-myAttr]')