ช่องทำเครื่องหมาย Javascript onChange


132

ฉันมีช่องทำเครื่องหมายในแบบฟอร์มและฉันต้องการให้มันทำงานตามสถานการณ์ต่อไปนี้:

  • ถ้าการตรวจสอบคนที่มันคุ้มค่าของฟิลด์ข้อความที่ ( totalCost) 10ควรจะกำหนดให้
  • จากนั้นถ้าฉันย้อนกลับไปและยกเลิกการเลือกฟังก์ชันcalculate()จะกำหนดค่าtotalCostตามพารามิเตอร์อื่น ๆ ในรูปแบบ

โดยพื้นฐานแล้วฉันต้องการส่วนที่เมื่อฉันทำเครื่องหมายในช่องฉันทำสิ่งหนึ่งและเมื่อฉันยกเลิกการเลือกฉันก็ทำอย่างอื่น


Checkboxid.Checked == true / false {เขียนเหตุการณ์ของคุณ}
Naresh

คำตอบ:


152
function calc()
{
  if (document.getElementById('xxx').checked) 
  {
      document.getElementById('totalCost').value = 10;
  } else {
      calculate();
  }
}

HTML

<input type="checkbox" id="xxx" name="xxx" onclick="calc();"/>

30
และถ้าผู้ใช้ใช้แป้นพิมพ์?
thomthom

6
นี่คือ JsFiddleที่สามารถทดสอบวิธีต่างๆได้ทั้งหมด: คลิกแป้นพิมพ์ฉลากและคีย์การเข้าถึง ทั้งหมดนี้ทำให้เกิดเหตุการณ์ใน Firefox
Roman Starkov

4
ขออภัยเหตุการณ์ไม่ถูกทริกเกอร์เมื่อสถานะช่องทำเครื่องหมายถูกเปลี่ยนผ่าน JavaScript
StanE

2
ฮ่า ๆ ใช้สิ่งนี้จาก javascript $ ('# checkbox'). attr ('checked', 'checked'); $ ( '# ช่องทำเครื่องหมาย') คลิก ().
Senad Meškin

5
คุณควรใช้ onchange แทนซึ่งออกแบบมาโดยเฉพาะสำหรับกรณีการใช้งานของ OP (ขอบคุณ ReeCube ด้านล่างสำหรับลิงค์) developer.mozilla.org/en-US/docs/Web/Events/change
Armando

90

จาวาสคริปต์บริสุทธิ์:

const checkbox = document.getElementById('myCheckbox')

checkbox.addEventListener('change', (event) => {
  if (event.target.checked) {
    alert('checked');
  } else {
    alert('not checked');
  }
})
My Checkbox: <input id="myCheckbox" type="checkbox" />


28

หากคุณใช้ jQuery .. ฉันสามารถแนะนำสิ่งต่อไปนี้ได้หมายเหตุ: ฉันตั้งสมมติฐานไว้ที่นี่

$('#my_checkbox').click(function(){
    if($(this).is(':checked')){
        $('input[name="totalCost"]').val(10);
    } else {
        calculate();
    }
});

19

ใช้เหตุการณ์ onclick เพราะทุกครั้งที่คลิกบนช่องทำเครื่องหมายจะเปลี่ยนมัน


29
จะเกิดอะไรขึ้นถ้าผู้ใช้ใช้แป้นพิมพ์?
thomthom

14
มันแปลกมาก แต่ก็ยังคลิกอยู่
SergeS

6
การคลิกนั้นใช้งานได้จริงแม้จะเริ่มทำงานเมื่อคุณใช้ป้ายกำกับเพื่อสลับช่องทำเครื่องหมาย แต่คุณควรใช้เหตุการณ์ 'การเปลี่ยนแปลง' จะดีกว่า! เหตุการณ์ 'การเปลี่ยนแปลง' มีไว้สำหรับสิ่งนี้developer.mozilla.org/en-US/docs/Web/Events/change
ReeCube

ดับเบิลคลิกล่ะ?
Chalky

4
นั่นคือสองคลิกตอนนี้ไม่ใช่เหรอ?
Rohmer

14

โซลูชันต่อไปนี้ใช้ jquery สมมติว่าคุณมีช่องทำเครื่องหมายที่มี ID checkboxIdของ

const checkbox = $("#checkboxId");

checkbox.change(function(event) {
    var checkbox = event.target;
    if (checkbox.checked) {
        //Checkbox has been checked
    } else {
        //Checkbox has been unchecked
    }
});


3

อ้างอิงช่องทำเครื่องหมายตามรหัสไม่ใช่ด้วย # กำหนดฟังก์ชันให้กับแอตทริบิวต์ onclick แทนที่จะใช้แอตทริบิวต์การเปลี่ยนแปลง

var checkbox = $("save_" + fieldName);
checkbox.onclick = function(event) {
    var checkbox = event.target;

    if (checkbox.checked) {
        //Checkbox has been checked
    } else {
        //Checkbox has been unchecked
    }
};

1

ฉันรู้ว่านี่ดูเหมือนคำตอบของ noob แต่ฉันวางไว้ที่นี่เพื่อที่จะได้ช่วยเหลือผู้อื่นในอนาคต

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

<!-- Begin Loop-->
<tr>
 <td><?=$criteria?></td>
 <td><?=$indicator?></td>
 <td><?=$target?></td>
 <td>
   <div class="form-check">
    <input type="checkbox" class="form-check-input" name="active" value="<?=$id?>" <?=$status?'checked':''?>> 
<!-- mark as 'checked' if checkbox was selected on a previous save -->
   </div>
 </td>
</tr>
<!-- End of Loop -->

คุณวางปุ่มไว้ด้านล่างตารางโดยมีอินพุตที่ซ่อนอยู่:

<form method="post" action="/goalobj-review" id="goalobj">

 <!-- we retrieve saved checkboxes & concatenate them into a string separated by commas.i.e. $saved_data = "1,2,3"; -->

 <input type="hidden" name="result" id="selected" value="<?= $saved_data ?>>
 <button type="submit" class="btn btn-info" form="goalobj">Submit Changes</button>
</form>

คุณสามารถเขียนสคริปต์ของคุณได้ดังนี้:

<script type="text/javascript">
    var checkboxes = document.getElementsByClassName('form-check-input');
    var i;
    var tid = setInterval(function () {
        if (document.readyState !== "complete") {
            return;
        }
        clearInterval(tid);
    for(i=0;i<checkboxes.length;i++){
        checkboxes[i].addEventListener('click',checkBoxValue);
    }
    },100);

    function checkBoxValue(event) {
        var selected = document.querySelector("input[id=selected]");
        var result = 0;
        if(this.checked) {

            if(selected.value.length > 0) {
                result = selected.value + "," + this.value;
                document.querySelector("input[id=selected]").value = result;
            } else {
                result = this.value;
                document.querySelector("input[id=selected]").value = result;
            }
        }
        if(! this.checked) { 

// trigger if unchecked. if checkbox is marked as 'checked' from a previous saved is deselected, this will also remove its corresponding value from our hidden input.

            var compact = selected.value.split(","); // split string into array
            var index = compact.indexOf(this.value); // return index of our selected checkbox
            compact.splice(index,1); // removes 1 item at specified index
            var newValue = compact.join(",") // returns a new string
            document.querySelector("input[id=selected]").value = newValue;
        }

    }
</script>

รหัสของช่องทำเครื่องหมายของคุณจะถูกส่งเป็นสตริง "1,2" ภายในตัวแปรผลลัพธ์ จากนั้นคุณสามารถแยกมันได้ที่ระดับคอนโทรลเลอร์ตามที่คุณต้องการ


0

จาวาสคริ

  // on toggle method
  // to check status of checkbox
  function onToggle() {
    // check if checkbox is checked
    if (document.querySelector('#my-checkbox').checked) {
      // if checked
      console.log('checked');
    } else {
      // if unchecked
      console.log('unchecked');
    }
  }

HTML

<input id="my-checkbox" type="checkbox" onclick="onToggle()">


0

ลอง

totalCost.value = checkbox.checked ? 10 : calculate();

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.