2009-12-13 74 views
16

Tôi đang cố gắng chọn hàng đầu tiên của bảng. Lưu ý: hàng đầu tiên được gói trong một thẻ thead, vì vậy:jQuery "chọn tất cả ngoại trừ"

<table> 
    <thead> 
    <tr> <!-- first row --> </tr> 
    </thead> 
    <tbody> 
    <tr> <!-- body --> </tr> 
    </tbody> 
    <tfoot> 
    <tr> <!-- body --> </tr> 
    </tfoot> 
</table> 

Những mẹo 'select first row' có thể làm việc nếu nó không được cho các thẻ wrapper. Đây là những gì tôi đã cố gắng nhưng không hoạt động:

$("*:not(thead)", tableSelector).remove(); 

Tức là, tôi muốn thoát khỏi tắt cả selectors tbody và tfoot sử dụng một "không tfoot" selector. Bởi vì tôi muốn loại bỏ mọi thứ khác khỏi bảng trừ <thead> và mọi thứ bên trong. Vì vậy, về cơ bản những gì tôi đang cố gắng làm là để chọn tất cả mọi thứ trừ thead và những gì bên trong nó; intutuively một cái gì đó như :not(thead *) có thể làm việc, nhưng không.

Giải pháp thay thế của tôi là $("tbody, tfoot", tableSelector).remove(); nhưng tôi muốn tìm hiểu và hiểu cách sử dụng đối diện (không chọn).

+0

Nó không rõ ràng những gì bạn đang cố gắng làm ở đây. Bạn có thể rephrase? – cletus

+0

'" tbody, tfoot "' có vẻ tốt nhất ở đây. Trong thực tế, tôi sẽ đề xuất nó cho đến khi tôi đọc đầy đủ câu hỏi của bạn. Tới điểm: ': not (thead)' không thành công vì nó cũng đã chọn và loại bỏ 'tr'. – Kobi

+0

Vì vậy, không có bộ chọn nào như "con trai và con cái của nó", vì vậy tôi có thể nói: không phải (thead-and-its'children)? – Martin

Trả lời

20

Câu hỏi của bạn không rõ ràng. Để chọn hàng đầu tiên trong một bảng duy nhất:

$("table tr:first")... 

hoặc ngược lại:

$("table tr:not(:first)")... 

sẽ làm điều đó nhưng điều đó sẽ phá vỡ nếu có nhiều hơn một bảng (nó sẽ chỉ chọn một dòng ngay cả khi có ba bảng). Bạn có thể làm việc xung quanh rằng với:

$("table").each(function() { 
    $(this).find("tr:first")... 
}); 

Bạn có thể nhận được tất cả các hàng không trong thead với:

$("table > :not(thead) > tr")... 

Edit: Tôi nghĩ rằng bạn đang quá phức tạp này. Nếu bạn muốn loại bỏ tất cả mọi thứ trừ thead và nội dung của nó, đó là tương đối đơn giản:

$("table > :not(thead)").remove(); 

Nếu bạn muốn để lại các yếu tố tbody và TFOOT tại chỗ thay đổi nó để:

$("table > :not(thead) > tr").remove(); 
+1

Ok, để rõ ràng. Chọn hàng đầu tiên KẾT THÚC THEO THEO THE. Vì tôi muốn xóa mọi thứ khác khỏi bảng trừ '' và mọi thứ bên trong thead. – Martin

+0

+1 cho "Câu hỏi của bạn không rõ ràng" ;-) – Frunsi

+0

+1 để bao quát tất cả các khả năng. :-) – Nagri

1

Sử dụng children() trên bộ chọn bảng sẽ chỉ chọn các con trực tiếp. Bạn có thể lọc điều này bằng cách sử dụng bộ chọn không phải của bạn.

$(tableSelector).children(':not(thead)').remove(); 
+0

Cái này thực sự chậm hơn khoảng 30 lần so với sử dụng giải pháp chỉ chọn. – vrutberg

+0

Chăm sóc để giải thích điều đó? Thử nghiệm đơn giản của tôi cho tôi thấy rằng giải pháp của bạn mất trung bình 400ms cho 1000 lần lặp và tôi mất một ít hơn 300ms cho 1000 lần lặp lại tương tự. – tvanfosson

+0

... lưu ý rằng trong thử nghiệm của tôi, tôi đã làm ẩn/hiển thị hơn là loại bỏ vì lý do rõ ràng. – tvanfosson

1

Tôi cố gắng để chọn hàng đầu tiên của một bảng.

Tại sao không sử dụng DOM cũ tốt?

mytable.rows[0] 
+0

Tôi muốn THEAD đi cùng với những hàng đơn giản không cắt nó. – Martin

+0

Hơn nữa, tôi muốn xóa mọi thứ khác khỏi bảng để chỉ việc chọn các hàng sẽ không đưa tôi đến bất kỳ đâu. – Martin

0

Nếu bạn muốn loại bỏ bất kỳ child of một table trừ thead, hãy thử chọn này:

table > *:not(thead) 

Sửa Vì bạn chỉ ra rằng bạn đã có bảng trong một biến:

$("> *:not(thead)", context) 
+0

Một lần nữa, tôi muốn sử dụng conetxt specifier. $ (xx, context) – Martin

+0

Không .. điều này cũng không hoạt động. Nó loại bỏ mọi thứ.Chỉ có "tbody, tfoot" dường như vẫn hoạt động cho đến bây giờ. – Martin

+0

@Martin: Và bối cảnh thực sự chỉ là bàn của bạn? Giống như '$ (" bảng ")'? – Gumbo

0

Các ": không phải" giả selector nhận khác chọn như một tham số, vì vậy bạn thực sự có thể loại bỏ tất cả mọi thứ trừ này và điều đó như thế này:

$(':not(thead, thead *)', 'table').remove(); 

Bạn có thể see it in action here.

Điều này rất giống với những gì bạn đã viết trong your comment, ngoại trừ bạn không sử dụng ngữ cảnh (loại bỏ nút bảng) và bạn đã sử dụng toán hạng con không bao gồm "mọi thứ" bên trong thead. chỉ bao gồm những đứa trẻ trực tiếp. Việc loại bỏ toán tử con ">" loại trừ tất cả các con cháu của nút, không chỉ các con trực tiếp.

-1

tôi sẽ như thế nào:

$('table thead tr:first-child') 
Các vấn đề liên quan