jQuery Xác định xem một lớp phù hợp có một id đã cho hay không


95

JQuery có id tương đương với câu lệnh sau là gì?

$('#mydiv').hasClass('foo')

vì vậy bạn có thể đặt tên lớp và kiểm tra xem nó có chứa id được cung cấp hay không.

cái gì đó như:

$('.mydiv').hasId('foo')

Tôi muốn áp dụng một phong cách cho một div nhất định. Ví dụ: tại thời điểm tải, tất cả với một lớp foo sẽ được hiển thị, nhưng tôi có thể muốn chuyển đổi một phiên bản của lớp foo đó có id là thanh.
Nicholas Murray

1
Sau đó, bạn chỉ cần làm, $('#bar.foo').toggle();bạn sẽ chỉ có một id vì chúng được BẮT BUỘC là duy nhất cho tài liệu. Nếu bạn chỉ muốn chuyển đổi id đó nếu nó thuộc lớp foothì chỉ cần thêm lớp vào bộ chọn id. nếu bộ chọn tìm thấy một tập hợp trống thì sẽ không có gì xảy ra, nếu nó tìm thấy một tập hợp có kết quả (trong đó chỉ có một) thì nó sẽ chuyển đổi phần tử. Tôi nghĩ rằng bạn đang suy nghĩ quá mức về điều này.
prodigitalson

3
chỉ để nói rằng những người bực bội nói rằng "tại sao bạn lại muốn làm điều đó?" khi tôi đang cố gắng làm điều này ngay bây giờ. Vấn đề với hasClass là nó trả về True nếu BẤT KỲ phần tử nào phù hợp với bộ chọn có lớp đã cho. Vì vậy, nơi tôi có nhiều p với lớp "cake" và các tên lớp bổ sung cho mỗi ("một", "hai", v.v.) Tôi đang gặp sự cố. Tôi muốn chọn tập hợp chung của p.cake và sau đó có một điều kiện (nếu class = "một" - $ var = 23 - v.v.). Vấn đề là tôi đang cố chuyển một $ var khác tùy thuộc vào tên lớp bổ sung. Tôi đang cố gắng không phải lặp lại các o chút toàn
Stella

Câu trả lời:


171

Bạn có thể đưa logic đó vào bộ chọn bằng cách kết hợp nhiều bộ chọn . Ví dụ: chúng ta có thể nhắm mục tiêu tất cả các phần tử với một id đã cho, cũng có một lớp cụ thể:

$("#foo.bar"); // Matches <div id="foo" class="bar">

Điều này sẽ trông giống như một cái gì đó bạn viết trong CSS. Lưu ý rằng nó sẽ không áp dụng cho tất cả các #foophần tử (mặc dù chỉ nên có một) và nó sẽ không áp dụng cho tất cả các .barphần tử (mặc dù có thể có nhiều). Nó sẽ chỉ tham chiếu các phần tử đủ điều kiện trên cả hai thuộc tính.

jQuery cũng có một .isphương pháp tuyệt vời cho phép bạn xác định xem một phần tử có những phẩm chất nhất định hay không. Bạn có thể kiểm tra tập hợp jQuery dựa trên bộ chọn chuỗi, Phần tử HTML hoặc đối tượng jQuery khác. Trong trường hợp này, chúng tôi sẽ chỉ kiểm tra nó với một bộ chọn chuỗi:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
+1 cho is(). Nên có một .hasId()bộ chọn chỉ vì nó có vẻ giống như một đối tác rõ ràng để .hasClass()thực sự ...
Matt Fletcher

43

Tôi có thể sẽ sử dụng $('.mydiv').is('#foo');Điều đó đã nói nếu bạn biết Id tại sao bạn sẽ không áp dụng nó cho bộ chọn ngay từ đầu?


17
Có thể mã đang đi vào một hàm gọi lại cần xử lý một trường hợp nhất định theo cách khác. Vì vậy, hàm được truyền một đối tượng jQuery tự động với các thuộc tính không xác định. Trong trường hợp này, $ ('câu trả lời của bạn'). Is ('hữu ích');
Peter G

1
Tôi có thể nghĩ ra bất kỳ lý do nào. Điều gì xảy ra nếu bạn muốn áp dụng cài đặt cụ thể cho thiết bị di động, chẳng hạn như nếu một phần tử có id = "mobile". Tại sao không quan trọng.
placeable

Chà, chỉ có 1 phần tử nên có một idthuộc tính nhất định nếu không nó phải là một số thuộc tính khác ... Tôi cho rằng nếu vị trí cấu trúc của phần tử được đề cập thay đổi dựa trên trang hoặc ứng dụng khách / tác nhân người dùng thì được, nhưng khác với điều đó .. .
prodigitalson

19

cập nhật: xin lỗi đã hiểu nhầm câu hỏi, .has()câu trả lời đã bị xóa .

một cách thay thế khác, tạo .hasId()plugin

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
Xin lỗi nhưng tôi nghĩ bạn đã hiểu sai câu hỏi: API has () báo cáo điều này: Giảm tập hợp các phần tử phù hợp thành những phần tử có phần tử con phù hợp với bộ chọn hoặc phần tử DOM. OP đang hỏi cách kiểm tra xem phần tử có lớp 'myDiv' cũng có Id foo hay không, trong khi has () sẽ tìm kiếm con cháu của 'myDiv' có Id 'foo'.
Nghiêng

7

Giả sử bạn đang lặp lại một số đối tượng DOM và bạn muốn tìm và bắt một phần tử có ID nhất định

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

Bạn có thể viết một cái gì đó như để tìm

$('#myDiv').find('#bar')

Lưu ý rằng nếu bạn sử dụng bộ chọn lớp, phương thức find sẽ trả về tất cả các phần tử phù hợp.

hoặc bạn có thể viết một hàm lặp lại sẽ thực hiện công việc nâng cao hơn

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

Có thể dễ dàng sửa đổi cùng một mã cho bộ chọn lớp.

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

Tôi rất vui vì bạn đã giải quyết được vấn đề của mình với index (), công cụ từng phù hợp với bạn. Tôi hy vọng điều này sẽ giúp những người khác có cùng vấn đề. Chúc mừng :)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

mỗi cái là không cần thiết vì sẽ không bao giờ có nhiều hơn một cái #theMysteryId.
prodigitalson

2
Nó giúp bạn đỡ rắc rối khi gán nó cho một biến, kiểm tra xem độ dài có trống không và sau đó tiếp tục với mã. Nếu bộ chọn không khớp với jQuery sẽ không gọi hàm "each", vì vậy nó rất đẹp và sạch sẽ. Bây giờ nếu tất cả những gì bạn muốn làm là gọi một số API jQuery, thì chắc chắn rồi.
Pointy

4

Chỉ cần nói rằng cuối cùng tôi đã giải quyết vấn đề này bằng cách sử dụng index ().

KHÔNG CÓ GÌ khác dường như hoạt động.

Vì vậy, đối với các phần tử anh em, đây là một công việc tốt nếu bạn đang chọn một lớp chung trước tiên và sau đó muốn sửa đổi một cái gì đó khác nhau cho từng lớp cụ thể.

CHỈNH SỬA: đối với những người không biết (như tôi) index () đưa ra giá trị chỉ mục cho mỗi phần tử khớp với bộ chọn, tính từ 0, tùy thuộc vào thứ tự của chúng trong DOM. Miễn là bạn biết có bao nhiêu phần tử với class = "foo", bạn không cần id.

Rõ ràng điều này không phải lúc nào cũng hữu ích, nhưng ai đó có thể thấy nó hữu ích.



1

Bạn cũng có thể kiểm tra xem phần tử id có được sử dụng hay không bằng cách làm như vậy:

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

Tôi sử dụng phương pháp này cho các Bảng dữ liệu toàn cầu và Bảng dữ liệu được sắp xếp cụ thể


các xác định phải ở trong dấu ngoặc kép để làm việc như vậy 'undefined'
Leo
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.