2013-08-18 62 views

Trả lời

65

Thứ tự để chọn hộp kiểm của một hàng bên trong bảng, trước tiên chúng tôi sẽ kiểm tra xem typeattribute của phần tử chúng tôi đang nhắm mục tiêu không phải là hộp kiểm hay không.

$(document).ready(function() { 
    $('.record_table tr').click(function(event) { 
    if (event.target.type !== 'checkbox') { 
     $(':checkbox', this).trigger('click'); 
    } 
    }); 
}); 

Demo


Nếu bạn muốn làm nổi bật các dòng của bảng trên checkboxchecked hơn chúng ta có thể sử dụng một điều kiện if với is(":checked"), nếu có hơn chúng ta tìm ra tr yếu tố gần gũi nhất sử dụng .closest() và hơn chúng ta thêm lớp vào nó bằng cách sử dụng addClass()

$("input[type='checkbox']").change(function (e) { 
    if ($(this).is(":checked")) { //If the checkbox is checked 
     $(this).closest('tr').addClass("highlight_row"); 
     //Add class on checkbox checked 
    } else { 
     $(this).closest('tr').removeClass("highlight_row"); 
     //Remove class on checkbox uncheck 
    } 
}); 

Demo

+0

Giải pháp tuyệt vời nhưng có một vấn đề nhỏ (nhỏ), hộp kiểm nằm bên trong thẻ nhãn (cho mục đích css), bất kỳ giải pháp jquery nào bạn biết? Cuối cùng là chỉ cần loại bỏ các thẻ nhãn và chuyển tất cả chúng sang 'span class = "label" hoặc một cái gì đó và cập nhật css. Cảm ơn cho dù bạn có được xung quanh để này hay không :) – Onimusha

+0

tuyệt vời .. giải pháp của bạn tiết kiệm rất nhiều thời gian –

+0

GG. Tốt đoạn kịch bản. Cảm ơn ông. Alien! – PipBoy2000

7

Câu hỏi này hữu ích cho tôi nhưng tôi gặp sự cố với giải pháp trước đó. Nếu bạn nhấp vào liên kết trong ô bảng, nó sẽ kích hoạt hộp kiểm chuyển đổi. Tôi googled này và tôi thấy một đề xuất thêm một event.stopPropagation() vào các liên kết của bảng, như thế này:

$('.record_table tr a').click(function(event) { 
    event.stopPropagation(); 
}); 

Giải pháp này là một ý tưởng tồi vì tôi đã có một số jquery popover bootstrap vào một liên kết của bảng. ..

Vì vậy, đây là giải pháp phù hợp với tôi tốt hơn. Bằng cách này khi tôi đang sử dụng bootstrap 2.3, điểm nổi bật của dòng được thực hiện bằng cách thêm lớp "thông tin" vào tr. Để sử dụng mã này, bạn chỉ cần thêm class="selectable" vào thẻ bảng.

$(".selectable tbody tr input[type=checkbox]").change(function(e){ 
    if (e.target.checked) 
    $(this).closest("tr").addClass("info"); 
    else 
    $(this).closest("tr").removeClass("info"); 
}); 

$(".selectable tbody tr").click(function(e){ 
    if (e.target.type != 'checkbox' && e.target.tagName != 'A'){ 
    var cb = $(this).find("input[type=checkbox]"); 
    cb.trigger('click'); 
    } 
}); 

Có thể bạn sẽ muốn cụ thể hơn với điều kiện thử nghiệm, ví dụ nếu bạn có các yếu tố đầu vào khác trong hàng.

0

Bạn chỉ có thể kích hoạt sự kiện nhấp chuột này ... :)

$(document).ready(function() 
    { 
     $("table tr th :checkbox").click(function(event) 
     { 
     $('tbody :checkbox').trigger('click'); 
     }); 
    }); 

HOẶC

$(document).ready(function() 
    { 
     $("table tr th :checkbox").on('click',function(event) 
     { 
     $('tbody :checkbox').trigger('click'); 
     }); 
    }); 
2

Triggering một nhấp chuột như rất nhiều các giải pháp cung cấp ở trên sẽ gây ra các chức năng để chạy hai lần. Cập nhật giá trị prop thay vì:

$('tr').click(function(event){ 
    alert('function runs twice'); 
    if(event.target.type !== 'checkbox'){ 
    //$(':checkbox', this).trigger('click'); 
    // Change property instead 
    $(':checkbox', this).prop('checked', true); 
    } 
}); 

Link to jsfiddle example here

+0

tại sao chức năng chạy hai lần? – Gagantous

+0

@Gagantous - câu hỏi hay. Khi một sự kiện xảy ra trên một phần tử, nó đầu tiên chạy các trình xử lý trên nó, sau đó trên đó là phụ huynh, và cứ thế. Trong triển khai này, hàm không chạy hai lần khi hộp kiểm đầu vào được bấm trực tiếp (bạn sẽ thấy điểm jsfiddle của tôi), nhưng thiết kế giao diện người dùng chuẩn chấp nhận các sự kiện (như nhấp) trên cột hoặc hàng để đặt thuộc tính trên phần tử (như giá trị hoặc kiểu). Vì vậy, việc kích hoạt bấm trigger theo cách này làm cho hàm chạy hai lần - xem Tuyên truyền. Đại diện hình ảnh tốt về những gì đang xảy ra: https://javascript.info/bubbling-and-capturing –

+1

Giải thích thực sự thú vị, cảm ơn bạn sir (y) – Gagantous

0

Mặc dù @Mr chấp nhận. Câu trả lời của người nước ngoài hoạt động tuyệt vời, nó không hoạt động trong trường hợp bạn quyết định thêm một hàng mới <tr> động với jQuery tại một số điểm.

Tôi khuyên bạn nên sử dụng phương thức ủy quyền sự kiện, đây chỉ là một sửa đổi nhỏ về câu trả lời được chấp nhận.

Thay vì:

... $('.record_table tr').click(function(event) { ...

sử dụng

... $('.record_table').on('click', 'tr', function(event) { ...

Và tương tự cho làm nổi bật, sử dụng:

... $(".record_table").on('change', "input[type='checkbox']", function (e) { ...

Thông tin thêm tại đây: Click event doesn't fire for table rows added dynamically