2009-09-19 27 views
11

Tôi có HTML sau:jQuery: chọn hộp kiểm dựa trên tên và giá trị so

<form id="test"> 
    <input type="radio" value="A" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'A');"> OPTION-A </a> 

    <input type="radio" value="B" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'B');"> OPTION-B </a> 

<input type="radio" value="C" name="C1"/> 
    <a href="javascript:selectCheckbox('C1', 'C');"> OPTION-C </a> 

    // several other: C2, C3, .. 
</form> 

Và tôi đang cố gắng để thực hiện selectCheckbox(chkbox, value), mà nên:

  1. tìm kiếm cho tất cả các đài phát thanh với name = chkbox và thiết lập attr('checked') = false
  2. tìm kiếm radio có name = chkbox AND val() = value và đặt attr('checked') = true

tôi không thể tìm ra, những gì bộ chọn đúng là, tôi đã thử sau đây mà không bất kỳ may mắn:

var name = "#" + chkbox + " :checked"; 
$(name).each(.. // doesn't work 

$('#'+chkbox).each(.. // if finds only the first occurence 
         // of i.e. C1, although I would expect 3 

$("input[@name='"+chkbox+"']").each(function() { .. 
// leaves me with the following error: 
// Warning: Expected attribute name or namespace but found '@name' 

Xin vui lòng cho tôi biết những gì tôi đang làm sai. Rất rất cảm ơn!

+0

Bạn không nên có nhiều yếu tố với cùng một ID ("C1") – Zed

+0

Bạn nói đúng, tôi loại bỏ các ID bây giờ. Cảm ơn! – MrG

+2

"Lưu ý: Trong jQuery 1.3 [@attr] các bộ chọn kiểu đã bị loại bỏ (chúng đã không được chấp nhận trước đó trong jQuery 1.2).Chỉ cần xóa biểu tượng '@' khỏi bộ chọn của bạn để làm cho chúng hoạt động trở lại. " – Zed

Trả lời

4

Tôi muốn sử dụng vị trí DOM tương đối để thực hiện điều hướng. Cũng lưu ý rằng bạn không thể có các phần tử khác nhau với cùng một id, nhưng trong trường hợp này không cần thiết vì bạn có thể sử dụng bộ chọn thuộc tính trên tên để tìm các đầu vào chính xác. Lưu ý rằng bạn đã biết cần phải kiểm tra đầu vào nào khác nhau dựa trên vị trí của liên kết được nhấp vào. Tôi muốn có mã riêng biệt từ đánh dấu vì vậy tôi đã cho các liên kết một lớp để làm cho chúng dễ dàng lựa chọn và chuyển ứng dụng trình xử lý nhấp chuột vào mã.

Cập nhật: Lưu ý rằng tôi đã xóa mã để bỏ chọn các radio khác. Với radio, thiết lập một để kiểm tra nên tự động bỏ chọn bất kỳ của những người khác.

$(function() { 
    $('a.checkbox-selector').click(function() { 
     // get the checkbox immediately preceding the link -- this should 
     // be checked. Checking it should automatically uncheck any other 
     // that may be checked. 
     $(this).prev(':checkbox'); 
       .attr('checked',true); 
     return false; // don't process the link 
    }); 
}); 

<form id="test"> 
    <input type="radio" value="A" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-A </a> 

    <input type="radio" value="B" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-B </a> 

    <input type="radio" value="C" name="C1"/> 
    <a href="#" class="checkbox-selector"> OPTION-C </a> 

    <!-- several other: C2, C3, ... --> 
</form> 
0

Hãy thử $("input[name='C1'] :checked]"). ID phải là duy nhất, vì vậy jquery có thể không mong đợi trả về nhiều hơn một phần tử.

1

Bạn không thể có nhiều phần tử có cùng một id trên một trang. Tất cả các yếu tố đầu vào của bạn có id "C1".

+1

Bạn có thể, nhưng đó là một điều xấu để làm vì một vài lý do. Hãy thử nó ra, và lưu ý rằng sự khác biệt giữa $ (" # id ") và $ ("[id = id]). Cái thứ hai sẽ trả về một tập hợp bao gồm nhiều phần tử chia sẻ id "id", trong khi phần tử cũ trả về một tập hợp bọc chỉ chứa phần tử được khai báo đầu tiên với id này. –

7

Nhờ sự giúp đỡ của bạn, cuối cùng tôi đã nhận nó:

function selectTestAnswer(chkbox, value) { 
    $("[name="+chkbox+"]").each(function() { 
     if ($(this).val() == value) 
      $(this).attr('checked', true); 
     else 
      if ($(this).attr('checked') == true) 
       $(this).attr('checked', false); 
}); 

}

+0

Tôi nghĩ rằng đó là mã nhiều hơn bạn cần. – tvanfosson

22

Hãy thử điều này:

$('input:radio[name="' + chkboxName + '"][value="' + value + '"]') 
    .attr('checked', 'checked'); 
5

Bạn có thể sử dụng prop() thay vì attr() nếu phiên bản jquery của bạn> 1.6

Tham khảo link này http://api.jquery.com/prop/

Tính đến jQuery 1.6, phương pháp .prop() cung cấp một cách để rõ ràng lấy giá trị tài sản, trong khi .attr() lấy các thuộc tính.

Vì vậy, các mã bạn đang tìm kiếm vẻ giống như

$('input:checkbox[name="Validators"][value="' + v + '"]').prop('checked',true); 
Các vấn đề liên quan