2012-02-16 35 views
6

Nói rằng tôi có một cấu trúc như sau:Cách chọn các phần tử có cùng giá trị thuộc tính trong jQuery?

<div data-stuff="foo"></div> 
<div data-stuff="foo"></div> 
<div data-stuff="foo"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="baz"></div> 

Và tôi muốn ẩn tất cả các divs với các thuộc tính như nhau ngoại trừ người đầu tiên, vì vậy tôi muốn nhận được:

<div data-stuff="foo"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="baz"></div> 

Bây giờ tôi biết tôi chỉ có thể làm điều này:

$('[data-stuff=foo]:gt(0), [data-stuff=bar]:gt(0), [data-stuff=baz]:gt(0)').hide(); 

Vấn đề là giá trị của data-stuff được tạo động và không thể đoán trước. Tôi có thể làm gì để hoàn thành nhiệm vụ này?

EDIT

Các yếu tố DOM mình không nhất thiết phải giống nhau, do đó $ .unique() sẽ không giúp đỡ ở đây. Nó cũng quan trọng là FIRST là một trong những vẫn còn hiển thị, do đó, sắp xếp lại không thể xảy ra.

+1

T.B. '$ .unique' không hoạt động theo cách bạn nghĩ. '$ .unique' là dành cho mảng các phần tử DOM, jQuery sử dụng nội bộ này khi tạo các đối tượng jQuery. –

+0

bản sao có thể có của [jQuery - Cách chọn theo thuộc tính] (http://stackoverflow.com/questions/9210073/jquery-how-to-select-by-attribute) –

+0

Tại sao bạn không thể thực thi mã ở trên khi 'rel' được thay đổi? – JKirchartz

Trả lời

5

Các brute force cách:

var found = {}; 

$("[rel]").each(function(){ 
    var $this = $(this); 
    var rel = $this.attr("rel"); 

    if(found[rel]){ 
     $this.hide(); 
    }else{ 
     found[rel] = true; 
    } 
}); 
+0

+1 yeah đây là những gì tôi đã suy nghĩ. Tôi không biết nếu có một bộ chọn cho điều này cho mỗi nói ... – pixelbobby

4

Làm thế nào về một cái gì đó như thế này:

$('div[rel]:visible').each(function(){ 
    var rel = $(this).attr('rel'); 
    $(this).nextAll('div[rel="'+rel+'"]').hide(); 
}); 

DEMO: http://jsfiddle.net/CsTQT/

+1

Lưu ý rằng 'nextAll' chỉ hoạt động cho anh chị em, vì vậy nếu cấu trúc html thực sự phức tạp hơn ví dụ được đăng, điều này có thể không hoạt động. –

+0

May mắn thay, @JamesMontagne là đúng. Tôi nên xem xét vấn đề này và tôi xin lỗi. Tôi muốn +2 nếu tôi có thể mặc dù có jsfiddle –

2

Thứ nhất, rel không được sử dụng để lưu trữ dữ liệu. Theo W3C, rel mô tả "mối quan hệ từ tài liệu hiện tại đến neo được chỉ định bởi thuộc tính href. Giá trị của thuộc tính này là danh sách các loại liên kết được phân cách bằng dấu cách."

Thứ hai, rel chỉ là một thuộc tính trên <a><link>. Bạn thực sự muốn sử dụng thuộc tính HTML5 data-*. Đừng lo lắng về hỗ trợ trình duyệt, nó hoạt động tất cả các cách trở lại IE 66 (có thể là 5).

Điều này sẽ có thể truy cập được qua chức năng JQuery $.data('name').

<div data-foo="bar"></div> 

sẽ thể truy cập thông qua:

$('div').filter(function(inputs){ 
    return $(this).data('foo') === 'bar'; 
}).hide() 
+0

Xin lỗi. Tôi không thực sự sử dụng rel. Tôi đã có một ví dụ trong đoạn mã của tôi sử dụng cùng một điều với các thẻ neo, và đó là một bản sao nhanh chóng và dán sau đó như một suy nghĩ sau khi tôi thay đổi chúng để DIVs. Bắt tốt, mặc dù –

0

Đó là phương tiện: nếu bạn chọn phần tử đầu tiên, bạn muốn ẩn mỗi anh em; Vì vậy, sử dụng JBrothersByAttr jquery plugin mà là một phần của Mounawa3et منوعات Jquery plugin:

$('[data-stuff=foo]:eq(0)').brothersByAttr('data-stuff').hide(); 
$('[data-stuff=bar]:eq(0)').brothersByAttr('data-stuff').hide(); 
$('[data-stuff=baz]:eq(0)').brothersByAttr('data-stuff').hide(); 

Demo:http://jsfiddle.net/abdennour/7ypEa/1/

Giải thích: 1. chọn đầu tiên qua :eq(0)

var jq= $('[data-stuff=foo]:eq(0)') 

2.chọn các yếu tố khác mà có cùng giá trị của data-stuff attr qua JBrothersByAttr:

var brothers=jq.brothersByAttr('data-stuff') 

3.Hide nó

brothers.hide() 
Các vấn đề liên quan