Thay đổi hộp kiểm jQuery và nhấp vào sự kiện


564

$(document).ready(function() {
  //set initial state.
  $('#textbox1').val($(this).is(':checked'));

  $('#checkbox1').change(function() {
    $('#textbox1').val($(this).is(':checked'));
  });

  $('#checkbox1').click(function() {
    if (!$(this).is(':checked')) {
      return confirm("Are you sure?");
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" id="checkbox1"/><br />
<input type="text" id="textbox1"/>

Ở đây .change()cập nhật giá trị hộp văn bản với trạng thái hộp kiểm. Tôi sử dụng .click()để xác nhận hành động trên bỏ chọn. Nếu người dùng chọn hủy, dấu kiểm được khôi phục nhưng .change()kích hoạt trước khi xác nhận.

Điều này khiến mọi thứ ở trạng thái không nhất quán và hộp văn bản nói sai khi hộp kiểm được chọn.

Làm cách nào tôi có thể xử lý việc hủy và giữ giá trị hộp văn bản phù hợp với trạng thái kiểm tra?


1
Nó hoạt động trong FF và chrome và có hành vi được giải thích trong IE 8. Vì vậy, điều quan trọng cần lưu ý là trình duyệt nào bạn cần để hoạt động và trình duyệt nào bạn gặp lỗi.
kasdega

Nó không phải là tốt nhất, nhưng tôi tin rằng nó hoạt động với tôi ở đây: http://jsfiddle.net/Skooljester/2Xxcn/ .
ayyp

Câu trả lời:


904

Đã thử nghiệm trong JSFiddle và thực hiện những gì bạn yêu cầu. Cách tiếp cận này có thêm lợi ích của việc bắn khi nhãn được liên kết với hộp kiểm được nhấp vào.

Cập nhật câu trả lời:

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val(this.checked);

    $('#checkbox1').change(function() {
        if(this.checked) {
            var returnVal = confirm("Are you sure?");
            $(this).prop("checked", returnVal);
        }
        $('#textbox1').val(this.checked);        
    });
});

Câu trả lời gốc:

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function() {
        if($(this).is(":checked")) {
            var returnVal = confirm("Are you sure?");
            $(this).attr("checked", returnVal);
        }
        $('#textbox1').val($(this).is(':checked'));        
    });
});

128
Chỉ cần một lưu ý, sử dụng nhanh hơn nhiều this.checkedthay vì $(this).is(':checked'): jsperf.com/prop-vs-ischecked/5
Dakota

37
@Dakota Được cấp, nó chậm hơn nhiều, nhưng chúng tôi vẫn nói về hoạt động 600k / giây. Vì vậy, 600 lần mỗi mili giây. Tôi nghĩ rằng nếu điều này bắt đầu gây ra các vấn đề về hiệu suất trên trang web của bạn, thì bạn có thể cần phải đánh giá lại javascript của mình;) Thật tốt khi hiểu các số liệu hiệu suất bằng mã. Cảm ơn.
Mike U

51
@MikeU: Đồng ý với bạn về việc tối ưu hóa sớm, nhưng xem xét việc this.checkedviết + javascript ngắn hơn nhiều, có thể thực sự đáng để sử dụng nói chung (ngoài việc nhanh hơn ~ 200 đến 300 lần).
Levite

11
Tôi muốn giới thiệu .prop () thay vì .attr () vì cái sau không hoạt động trong mọi trường hợp và tôi tin rằng jQuery khuyên dùng .prop () ngay bây giờ.
kabadisha

2
Tôi nghĩ rằng [cái này] bằng $ ('# textbox1'). Val (this.checked); đề cập đến tài liệu. Nó phải là $ ('# textbox1'). Val ($ ('# hộp1'). Là (': đã kiểm tra'));
yurin

90

Bản giới thiệu

Sử dụng mousedown

$('#checkbox1').mousedown(function() {
    if (!$(this).is(':checked')) {
        this.checked = confirm("Are you sure?");
        $(this).trigger("change");
    }
});

Nó hiển thị cảnh báo khi kiểm tra nó và nó luôn ngăn tôi kiểm tra trên thực tế. Đây là trên Chrome.
pimvdb

giống như @pimvdm. Xác nhận bật lên ngay cả đối với hành động kiểm tra (chỉ nên bật lên để bỏ chọn) và chọn ok không dẫn đến việc chọn hộp.
Giáo sư Chaos

1
Nó hoạt động khi sử dụng chuột, nhưng không phải nếu bạn đang kiểm tra nó bằng bàn phím.
frinux

3
@frinux Điều đó khá đơn giản vì đó là câu hỏi liên quan đến chuột. Vui lòng không tải xuống câu trả lời dựa trên mức độ phù hợp của chúng đối với các vấn đề hoàn toàn riêng biệt. Nếu bạn gặp vấn đề kích hoạt trạng thái của một chỉ báo sau khi kiểm tra hộp kiểm qua bàn phím, vui lòng gửi câu hỏi về nó thay vì bỏ qua các câu trả lời một cách bất cẩn.
Joseph Marikle

3
Bị từ chối vì mousedown không phải là cách duy nhất người dùng có thể tương tác với hộp kiểm.
Jonathan

51

Hầu hết các câu trả lời sẽ không bắt được (có lẽ) nếu bạn sử dụng <label for="cbId">cb name</label>. Điều này có nghĩa là khi bạn nhấp vào nhãn, nó sẽ đánh dấu vào ô thay vì nhấp trực tiếp vào hộp kiểm. (Không chính xác câu hỏi, nhưng các kết quả tìm kiếm khác nhau có xu hướng đến đây)

<div id="OuterDivOrBody">
    <input type="checkbox" id="checkbox1" />
    <label for="checkbox1">Checkbox label</label>
    <br />
    <br />
    The confirm result:
    <input type="text" id="textbox1" />
</div>

Trong trường hợp bạn có thể sử dụng:

Earlier versions of jQuery:

$('#OuterDivOrBody').delegate('#checkbox1', 'change', function () {
    // From the other examples
    if (!this.checked) {
        var sure = confirm("Are you sure?");
        this.checked = !sure;
        $('#textbox1').val(sure.toString());
    }
});

Ví dụ về JSFiddle với jQuery 1.6.4

jQuery 1.7+

$('#checkbox1').on('change', function() { 
    // From the other examples
    if (!this.checked) {
        var sure = confirm("Are you sure?");
        this.checked = !sure;
        $('#textbox1').val(sure.toString());
    }
});

Ví dụ về JSFiddle với jQuery 2.x mới nhất

  • Đã thêm ví dụ jsfiddle và html với nhãn hộp kiểm có thể nhấp

1
Đó là #OuterDivOrBody chứ không phải .OuterDivOrBody :)
Laurent Brieu

24

Chà .. chỉ để cứu cơn đau đầu (đã quá nửa đêm ở đây), tôi có thể nghĩ ra:

$('#checkbox1').click(function() {
  if (!$(this).is(':checked')) {
    var ans = confirm("Are you sure?");
     $('#textbox1').val(ans);
  }
});

Hy vọng nó giúp


11

Đối với tôi điều này hoạt động rất tốt:

$('#checkboxID').click(function () {
    if ($(this).attr('checked')) {
        alert('is checked');
    } else {
        alert('is not checked');
    }
})

4
Đã xem qua điều này thông qua một tìm kiếm trên web. Bạn nên sử dụng 'prop' thay vì 'attr' >> api.jquery.com/prop
Dr Schizo

11

Của bạn đây

Html

<input id="ProductId_a183060c-1030-4037-ae57-0015be92da0e" type="checkbox" value="true">

JavaScript

<script>
    $(document).ready(function () {

      $('input[id^="ProductId_"]').click(function () {

        if ($(this).prop('checked')) {
           // do what you need here     
           alert("Checked");
        }
        else {
           // do what you need here         
           alert("Unchecked");
        }
      });

  });
</script>

6

Loại bỏ sự kiện thay đổi và thay vào đó thay đổi giá trị của hộp văn bản trong sự kiện nhấp chuột. Thay vì trả về kết quả xác nhận, hãy bắt nó trong một var. Nếu nó đúng, thay đổi giá trị. Sau đó trả lại var.


6

Hộp kiểm bấm và kiểm tra giá trị trong cùng một vòng lặp sự kiện là vấn đề.

Thử cái này:

$('#checkbox1').click(function() {
    var self = this;
    setTimeout(function() {

        if (!self.checked) {
            var ans = confirm("Are you sure?");
            self.checked = ans;
            $('#textbox1').val(ans.toString());
        }
    }, 0);
});

Bản trình diễn: http://jsfiddle.net/mrchief/JsUWv/6/


6

nếu bạn đang sử dụng iCheck Jquery, hãy sử dụng đoạn mã dưới đây

 $("#CheckBoxId").on('ifChanged', function () {
                alert($(this).val());
            });

5

Thử cái này

$('#checkbox1').click(function() {
        if (!this.checked) {
            var sure = confirm("Are you sure?");
            this.checked = sure;
            $('#textbox1').val(sure.toString());
        }
    });

5
$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function() {
        $('#textbox1').val($(this).is(':checked'));
    });

    $('#checkbox1').click(function() {
        if (!$(this).is(':checked')) {
            if(!confirm("Are you sure?"))
            {
                $("#checkbox1").prop("checked", true);
                $('#textbox1').val($(this).is(':checked'));
            }
        }
    });
});

4
// this works on all browsers.

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function(e) {
        this.checked =  $(this).is(":checked") && !!confirm("Are you sure?");
        $('#textbox1').val(this.checked);
        return true;
    });
});

4
$('#checkbox1').click(function() {
    if($(this).is(":checked")) {
        var returnVal = confirm("Are you sure?");
        $(this).attr("checked", returnVal);
    }
    $('#textbox1').val($(this).is(':checked')); 
});


<div id="check">
    <input type="checkbox" id="checkbox1" />
    <input type="text" id="textbox1" />
</div>

4

Trả lời muộn, nhưng bạn cũng có thể sử dụng on("change")

$('#check').on('change', function() {
     var checked = this.checked
    $('span').html(checked.toString())
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" id="check" > <span>Check me!</span>


1

chỉ cần sử dụng nhấp vào sự kiện id hộp kiểm của tôi là CheckAll

     $('#CheckAll').click(function () {

        if ($('#CheckAll').is(':checked') == true) {

             alert(";)");
      }
    }

1

nhận giá trị radio theo tên

 $('input').on('className', function(event){
        console.log($(this).attr('name'));
        if($(this).attr('name') == "worker")
            {
                resetAll();                 
            }
    });

1

Tôi không chắc tại sao mọi người lại làm điều này quá phức tạp. Đây là tất cả những gì tôi đã làm.

if(!$(this).is(":checked")){ console.log("on"); }

-1
 $("#person_IsCurrentAddressSame").change(function ()
    {
        debugger
        if ($("#person_IsCurrentAddressSame").checked) {
            debugger

        }
        else {

        }

    })

3
Các câu trả lời chỉ có mã được coi là chất lượng thấp: đảm bảo cung cấp giải thích về mã của bạn làm gì và cách giải quyết vấn đề. Nó sẽ giúp người hỏi và người đọc tương lai cả nếu bạn có thể thêm thông tin trong bài viết của mình. Xem thêm Giải thích các câu trả lời hoàn toàn dựa trên mã: meta.stackexchange.com/questions/114762/iêu
borchvm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.