ช่องทำเครื่องหมาย jQuery เปลี่ยนแล้วคลิกเหตุการณ์


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"/>

ที่นี่.change()อัพเดตค่าช่องข้อความด้วยสถานะช่องทำเครื่องหมาย ฉันใช้.click()เพื่อยืนยันการกระทำที่ไม่เลือก หากผู้ใช้เลือกยกเลิกเครื่องหมายถูกจะคืนค่า แต่.change()ไฟก่อนที่จะยืนยัน

สิ่งนี้จะทำให้สิ่งต่าง ๆ อยู่ในสถานะที่ไม่สอดคล้องกันและกล่องข้อความบอกว่าเป็นเท็จเมื่อมีการทำเครื่องหมายที่ช่องทำเครื่องหมาย

ฉันจะจัดการกับการยกเลิกและรักษาค่าของกล่องข้อความให้สอดคล้องกับสถานะการตรวจสอบได้อย่างไร


1
มันทำงานใน FF และโครเมี่ยมและมีพฤติกรรมที่อธิบายใน IE 8 ดังนั้นมันอาจเป็นสิ่งสำคัญที่จะต้องทราบว่าเบราว์เซอร์ใดที่คุณต้องการใช้ในการทำงานและที่คุณเห็นข้อผิดพลาด
kasdega

มันไม่ได้เป็นสิ่งที่ดีที่สุด แต่ผมเชื่อว่ามันทำงานสำหรับฉันที่นี่: http://jsfiddle.net/Skooljester/2Xxcn/
ayyp

คำตอบ:


904

ผ่านการทดสอบในJSFiddleและทำสิ่งที่คุณต้องการวิธีการนี้มีประโยชน์เพิ่มเติมในการยิงเมื่อมีการคลิกที่ป้ายกำกับที่เกี่ยวข้องกับช่องทำเครื่องหมาย

อัพเดทคำตอบ:

$(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);        
    });
});

คำตอบเดิม:

$(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
เพิ่งทราบว่ามันเร็วกว่าการใช้this.checkedแทน$(this).is(':checked'): jsperf.com/prop-vs-ischecked/5
ดาโกต้า

37
@ ดาโคตาได้รับมันช้ากว่ามาก แต่เรายังคงพูดถึงการดำเนินงาน 600k / วินาที ดังนั้น 600 ครั้งต่อมิลลิวินาที ฉันคิดว่าถ้าสิ่งนี้เริ่มก่อให้เกิดปัญหาประสิทธิภาพการทำงานบนหน้าเว็บของคุณคุณอาจต้องประเมินจาวาสคริปต์ของคุณอีกครั้ง;) เป็นการดีที่จะเข้าใจตัวชี้วัดประสิทธิภาพด้วยโค้ด ขอบคุณ
Mike U

51
@MikeU: เห็นด้วยกับคุณเกี่ยวกับการปรับให้เหมาะสมก่อนกำหนด แต่การพิจารณาว่าthis.checkedสั้นกว่าการเขียน + javascript ดั้งเดิมมันอาจจะคุ้มค่าที่จะใช้โดยทั่วไป (นอกเหนือจากการเร็วกว่า ~ 200 ถึง 300 เท่า)
Levite

11
ฉันอยากจะแนะนำ. prop () แทนที่จะเป็น .attr () เนื่องจากหลังไม่ทำงานในทุกกรณีและฉันเชื่อว่า jQuery แนะนำ. prop () ตอนนี้
kabadisha

2
ฉันคิดว่า [นี่] ใน $ ('# textbox1'). val (this.checked); หมายถึงเอกสาร ควรเป็น $ ('# textbox1'). val ($ ('# checkbox1'). คือ (': ถูกตรวจสอบ'));
yurin

90

การสาธิต

ใช้ mousedown

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

มันจะแสดงการแจ้งเตือนเมื่อตรวจสอบมันและจะป้องกันไม่ให้ฉันตรวจสอบในความเป็นจริง นี่คือใน Chrome
pimvdb

เหมือนกับ @pimvdm การยืนยันจะปรากฏขึ้นแม้กระทั่งสำหรับการตรวจสอบการกระทำ (มันควรจะปรากฏขึ้นเพื่อยกเลิกการเลือก) และการเลือกตกลงไม่ส่งผลในการตรวจสอบกล่อง
ศาสตราจารย์ Chaos

1
มันทำงานได้เมื่อใช้เมาส์ แต่ไม่ได้ถ้าคุณกำลังตรวจสอบด้วยแป้นพิมพ์
frinux

3
@ frinux นั่นเป็นเพียงเพราะคำถามเกี่ยวกับเมาส์ โปรดอย่าลงคะแนนคำตอบตามความเกี่ยวข้องกับประเด็นที่แยกต่างหากทั้งหมด หากคุณมีปัญหาในการทริกเกอร์สถานะของตัวบ่งชี้หลังจากทำเครื่องหมายในช่องทำเครื่องหมายผ่านแป้นพิมพ์โปรดโพสต์คำถามเกี่ยวกับเรื่องนี้แทนที่จะตอบคำตอบที่ไม่ลงรอยกัน
Joseph Marikle

3
ลดลงเนื่องจาก mousedown ไม่ใช่วิธีเดียวที่ผู้ใช้สามารถโต้ตอบกับช่องทำเครื่องหมาย
โจนาธาน

51

ส่วนใหญ่ของคำตอบจะไม่จับมัน (สมมุติ) <label for="cbId">cb name</label>ถ้าคุณใช้ ซึ่งหมายความว่าเมื่อคุณคลิกที่ป้ายกำกับมันจะทำเครื่องหมายที่กล่องแทนที่จะคลิกโดยตรงที่ช่องทำเครื่องหมาย (ไม่ตรงกับคำถาม แต่ผลการค้นหาที่หลากหลายมักมาที่นี่)

<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>

ในกรณีนี้คุณสามารถใช้:

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());
    }
});

ตัวอย่าง JSFiddle พร้อม 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());
    }
});

ตัวอย่าง JSFiddle พร้อม jQuery 2.x ล่าสุด

  • เพิ่มตัวอย่าง jsfiddle และ html ที่มีป้ายกำกับช่องทำเครื่องหมายที่คลิกได้

1
มันเป็น #OuterDivOrBody ไม่ได้. OputerDivOrBody :)
Laurent Brieu

24

อืม .. เพื่อรักษาอาการปวดหัว (เที่ยงคืนที่ผ่านมาของที่นี่) ฉันจะเกิดขึ้นกับ:

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

หวังว่ามันจะช่วย


11

สำหรับฉันมันใช้งานได้ดี:

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

4
มาถึงสิ่งนี้ผ่านการค้นหาเว็บ คุณควรใช้ 'prop' แทน 'attr' >> api.jquery.com/prop
Dr Schizo

11

อยู่นี่ไง

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

กำจัดเหตุการณ์การเปลี่ยนแปลงและเปลี่ยนค่าของกล่องข้อความในเหตุการณ์คลิกแทน แทนที่จะส่งคืนผลลัพธ์ของการยืนยันให้จับมันในรูปแบบ หากเป็นจริงให้เปลี่ยนค่า จากนั้นคืนค่า var


6

ช่องทำเครื่องหมายคลิกและตรวจสอบค่าในลูปเหตุการณ์เดียวกันคือปัญหา

ลองสิ่งนี้:

$('#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);
});

ตัวอย่าง: http://jsfiddle.net/mrchief/JsUWv/6/


6

หากคุณใช้ iCheck Jquery ให้ใช้รหัสด้านล่าง

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

5

ลองสิ่งนี้

$('#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

ตอบกลับช้า แต่คุณสามารถใช้ 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

เพียงแค่ใช้คลิกเหตุการณ์รหัสช่องทำเครื่องหมายของฉันคือ CheckAll

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

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

             alert(";)");
      }
    }


1

ฉันไม่แน่ใจว่าทำไมทุกคนทำให้เรื่องนี้ซับซ้อน นี่คือทั้งหมดที่ฉันทำ

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

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

        }
        else {

        }

    })

3
คำตอบที่ใช้รหัสเท่านั้นถือว่ามีคุณภาพต่ำ: ตรวจสอบให้แน่ใจว่าได้ให้คำอธิบายว่าโค้ดของคุณทำอะไรและแก้ปัญหาอย่างไร มันจะช่วยผู้ถามและผู้อ่านในอนาคตทั้งสองหากคุณสามารถเพิ่มข้อมูลเพิ่มเติมในโพสต์ของคุณ ดูเพิ่มเติมที่การอธิบายคำตอบแบบอิงรหัสทั้งหมด: meta.stackexchange.com/questions/114762/…
borchvm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.