2010-07-19 28 views
10

Tôi có một bảng với dữ liệu trong:jQuery selector có điều kiện cho hàng bảng

<td> item </td><td> order code </td><td> price </td>

Tôi đang xử lý bảng với jQuery mà cần phải tìm mã theo thứ tự:

$.each($('.productList tbody tr'), function() { 
    var orderCode = $(this).find('td:eq(1)').html().trim(); 
    // do stuff 
}); 

Nếu không có sản phẩm nào, bảng hiển thị thông báo:

<td colspan="3"> There are no products to display </td>

Hàng trên làm cho chức năng jQuery bị đánh bom. Cách mạnh nhất để sử dụng công cụ chọn có điều kiện để bỏ qua hàng "không có sản phẩm" là gì? Có bộ chọn cho colspan="1" hoặc colspan is not set hoặc bất kỳ công cụ nào cần phải chọn không?

Trả lời

8

Đừng trau chuốt chọn của bạn, nó sẽ không mở rộng quy mô cũng vì jQuery sẽ phải đánh giá tất cả các phần tử con. Thay vào đó, hãy tránh lỗi ...

$('.productList tbody tr').each(function() { 
    var orderCode = $(this).find('td:eq(1)'); 

    if(orderCode.length > 0) { // Make sure it exists 
    orderCode = orderCode.html().trim(); 
    // do stuff 
    } 
}); 
13

Như thế này:

$('.productList tbody tr:has(td:nth-child(2))').each(function() { 
    ... 
}); 

này sẽ chỉ chọn <tr> yếu tố mà có một <td> đó là đứa con thứ hai của mẹ. (Các nth-child selector là một-based)

+0

chính xác những gì tôi đang tìm kiếm, cảm ơn – fearofawhackplanet

+0

@ jAndy, thử nghiệm đó đơn giản là quá nóng. Bạn đang thử nghiệm giải pháp của bạn 500 lần, nhưng SLaks 'được kiểm tra 10000 lần! Và bạn không định nghĩa lại biến 'start' thành' + new Date' sau khi giải pháp của bạn chạy ... – James

+0

Tôi không biết tại sao nó không chọn bất cứ thứ gì ('.length' hiển thị 0). @SLaks, tôi nghĩ rằng bạn đã bỏ lỡ rằng đóng ngoặc đơn. Những công việc này. http://stackoverflow.com/questions/3281384/jquery-conditional-selector-for-table-rows/3281527#3281527 – IsmailS

2

Bạn có thể kiểm tra có bao nhiêu td s có:

$.each($('.productList tbody tr'), function() { 
    var tds = $(this).find('td'); 
    if(tds.length >= 2) { 
     var orderCode = tds.eq(1).html().trim(); 
     // do stuff 
    } 
}); 
3

Nếu bạn có thể thay đổi cách bạn tạo bảng, sử dụng các lớp học là một giải pháp làm sạch:

<td class="item-name"> item </td> 
<td class="order-code"> order code </td> 
<td class="item-price"> price </td> 

Sau đó chọn chỉ lớp mong muốn:

var orderCode = $(this).find('td.order-code').html().trim(); 
if(orderCode) 
{ 
    //do stuff 
} 

này cũng sẽ giúp bạn tăng tính linh hoạt trong việc tạo kiểu cho bảng bằng CSS và mã của bạn sẽ không bị hỏng nếu bạn thêm hoặc sắp xếp lại các cột.

+0

đó có thể là ý tưởng hay, tôi sẽ ghi nhớ điều đó trong lần sau – fearofawhackplanet

0

Sử dụng phương thức .attr(). Kiểm tra api.jquery.com và điều đó sẽ giúp bạn có thể tìm ra cách để lấy thuộc tính colspan từ các ô của bạn.

0

More lọc những gì SLaks đã viết

$("table tbody tr td:nth-child(2):contains('code')")

Các vấn đề liên quan