jQuery chọn theo thuộc tính sử dụng toán tử AND và OR


105

Tôi đang suy nghĩ về việc, liệu trong jQuery có thể chọn các phần tử theo các thuộc tính đã đặt tên bằng cách sử dụng AND và OR hay không.

Thí dụ:

<div myid="1" myc="blue">1</div>
<div myid="2" myc="blue">2</div>
<div myid="3" myc="blue">3</div>
<div myid="4">4</div>

Tôi muốn chọn tất cả các phần tử trong đó myc="blue"trừ những phần tử myidđược đặt thành 1 hoặc 3.

Vì vậy, tôi đã thử:

a=$('[myc="blue"] [myid="1"]  [myid="3"]');

nhưng nó không hoạt động, tương tự ở đây:

a=$('[myc="blue"] && [myid="1"] || [myid="3"]');

Có thể mà không cần viết các chức năng lọc đặc biệt?


7
NB: Bạn không nên tạo ra các thuộc tính của riêng mình như mycmyid. Nếu bạn đang sử dụng HTML5 thì tiền tố của chúng bằng data-: data-mycdata-myid.
RoToRa

@RoToRa, có tài liệu nào trong HTML5 nói rằng bạn nên làm như vậy không? Hầu hết các trang web tôi thấy sử dụng bất cứ điều gì não của nhà phát triển nghĩ về vào thời điểm đó ...
Alexis Wilke

1
Chỉ bởi vì mọi người làm điều đó, nó không có nghĩa là nó chính xác. Xem Phần 3.2.1 của HTML5 : "Tác giả không được sử dụng các phần tử, thuộc tính hoặc giá trị thuộc tính không được cho phép bởi đặc tả này hoặc các thông số kỹ thuật áp dụng khác, vì làm như vậy sẽ khiến ngôn ngữ này khó được mở rộng hơn trong tương lai."
RoToRa

1
Đó là một ví dụ kém về một câu hỏi hay. Điều gì về các loại phần tử khác nhau như đầu vào?
jesus g_force Harris

Câu trả lời:


193

Hoạt động

a=$('[myc="blue"][myid="1"][myid="3"]');

HOẶC hoạt động, sử dụng dấu phẩy

a=$('[myc="blue"],[myid="1"],[myid="3"]');

Như @Vega đã nhận xét:

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]');

1
Tôi nghĩ, anh ấy muốnmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

2
nếu tôi sử dụng a=$('[myc="blue"] [myid="1"],[myid="3"]');nó có nghĩa là nó ([myc="blue"] AND [myid="1"]) OR [myid="3"]hay ([myc="blue"]) AND ([myid="1"] OR [myid="3"]) tôi đang tìm cái thứ 2 // Chỉnh sửa: cảm ơn bạn đã cập nhật! :-)
The Bndr

18

Sử dụng đơn giản .filter() [docs] (AND) bằng cách sử dụng nhiều bộ chọn [docs] (OR):

$('[myc="blue"]').filter('[myid="1"],[myid="2"]');

Nói chung, bộ chọn chuỗi, giống như a.foo.bar[attr=value]một số loại bộ chọn VÀ.

jQuery có tài liệu phong phú về các bộ chọn được hỗ trợ, rất đáng để đọc.


bạn có biết, nếu điều này nhanh hơn câu trả lời từ gabe?
The Bndr

Tôi không biết, có thể, có thể không.
Felix Kling

10

Làm thế nào về việc viết một bộ lọc như dưới đây,

$('[myc="blue"]').filter(function () {
   return (this.id == '1' || this.id == '3');
});

Chỉnh sửa: @Jack Cảm ơn .. hoàn toàn bỏ lỡ nó ..

$('[myc="blue"]').filter(function() {
   var myId = $(this).attr('myid');   
   return (myId == '1' || myId == '3');
});

BẢN GIỚI THIỆU


5

Toán tử and trong một bộ chọn chỉ là một chuỗi trống và toán tử or là dấu phẩy.

Tuy nhiên, không có nhóm hoặc mức độ ưu tiên, vì vậy bạn phải lặp lại một trong các điều kiện:

a=$('[myc=blue][myid="1"],[myc=blue][myid="3"]');

bạn có cần những câu trích dẫn đó không? Ý tôi là chỉ vì sự nhất quán .. có lẽ chỉ tôi. >. <
Selvakumar Arumugam

1
@Vega: Bạn không cần dấu ngoặc kép cho các chuỗi đơn giản như blue, nhưng tôi không chắc về các giá trị số, vì vậy tôi đã giữ chúng.
Guffa

5

Trước tiên, hãy tìm điều kiện xảy ra trong tất cả các tình huống, sau đó lọc các điều kiện đặc biệt:

$('[myc="blue"]')
    .filter('[myid="1"],[myid="3"]');

1

Trong trường hợp đặc biệt của bạn, nó sẽ là

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]');

0

JQuery sử dụng bộ chọn CSS để chọn các phần tử, vì vậy bạn chỉ cần sử dụng nhiều hơn một quy tắc bằng cách phân tách chúng bằng dấu phẩy, như vậy:

a=$('[myc="blue"], [myid="1"], [myid="3"]');

Biên tập:

Xin lỗi, bạn muốn màu xanh lam và 1 hoặc 3. Còn:

a=$('[myc="blue"][myid="1"],  [myid="3"]');

Đặt hai bộ chọn thuộc tính lại với nhau sẽ cho bạn VÀ, sử dụng dấu phẩy cho bạn HOẶC.


1
Tôi nghĩ, anh ấy muốnmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

Bạn cần lặp lại [myc="blue"]bộ chọn trong ví dụ thứ hai.
RoToRa

-1

Để chọn đúng các phần tử bằng cách sử dụng các phép toán logic mà bạn đã nêu, bạn chỉ cần jQuery.filter()thực hiện ANDthao tác này, không phải "chức năng lọc đặc biệt". Bạn cũng cần jQuery.add()cho ORhoạt động.

var elements = $('[myc="blue"]').filter('[myid="1"').add('[myid="3"');

Ngoài ra, có thể thực hiện bằng cách sử dụng tốc ký trong một bộ chọn duy nhất, trong đó các bộ chọn gây nhiễu cùng hoạt động như một ANDvà phân tách bằng dấu phẩy hoạt động như một OR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]');
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.