jQuery $ (“ # radioButton”). change (…) ไม่ทำการยิงระหว่างการยกเลิกการเลือก


172

ประมาณหนึ่งเดือนที่ผ่านมาคำถามของ Mitt ยังไม่ได้รับคำตอบ น่าเศร้าที่ฉันกำลังตกอยู่ในสถานการณ์เดียวกันตอนนี้

http://api.jquery.com/change/#comment-133939395

นี่คือสถานการณ์: ฉันใช้ jQuery เพื่อบันทึกการเปลี่ยนแปลงในปุ่มตัวเลือก เมื่อเลือกปุ่มตัวเลือกฉันจะเปิดใช้งานกล่องแก้ไข เมื่อยกเลิกการเลือกปุ่มตัวเลือกฉันต้องการให้กล่องแก้ไขถูกปิดใช้งาน

การเปิดใช้งานใช้งานได้ เมื่อฉันเลือกปุ่มตัวเลือกอื่นในกลุ่มchangeเหตุการณ์จะไม่เริ่มทำงาน ไม่มีใครรู้วิธีการที่จะแก้ไขปัญหานี้?

<input type="radio" id="r1" name="someRadioGroup"/> 

<script type="text/javascript">
    $("#r1").change(function () {
        if ($("#r1").attr("checked")) {
            $('#r1edit:input').removeAttr('disabled');
        }
        else {
            $('#r1edit:input').attr('disabled', true);
        }
    });
</script>

รหัสปัจจุบันของคุณจะรับฟังการเปลี่ยนแปลงของปุ่มตัวเลือกด้วยid=r1
Rafay

1
หากเลือก id = r2 id = r1 ควรถูกยกเลิกการเลือกหรือไม่ การยกเลิกการเลือกปุ่มตัวเลือกไม่ได้ถูกจับใช่ไหม
antwarpes

2
chk สิ่งนี้อาจจะช่วยjsfiddle.net/aqZgs
Rafay

อย่าใช้ removeAttr ( 'คนพิการ') ใช้ไม้ค้ำยัน () เพื่อเปลี่ยนสถานะให้ดูคำตอบของฉัน
พื้นฐาน

คำตอบ:


311

ดูเหมือนว่าchange()ฟังก์ชั่นจะถูกเรียกเมื่อคุณตรวจสอบปุ่มตัวเลือกไม่ใช่เมื่อคุณยกเลิกการเลือก โซลูชันที่ฉันใช้คือผูกเหตุการณ์การเปลี่ยนแปลงกับปุ่มตัวเลือกทุกปุ่ม:

$("#r1, #r2, #r3").change(function () {

หรือคุณสามารถตั้งชื่อปุ่มทั้งหมดให้เป็นชื่อเดียวกัน:

$("input[name=someRadioGroup]:radio").change(function () {

นี่คือตัวอย่าง jsfiddle ที่ใช้งานได้(อัปเดตจากความคิดเห็นของ Chris Porter)

ความคิดเห็นของ Per @ Ray คุณควรหลีกเลี่ยงการใช้ชื่อกับ.พวกเขา ชื่อเหล่านั้นทำงานใน jQuery 1.7.2 แต่ไม่ได้อยู่ในเวอร์ชันอื่น ( ตัวอย่าง jsfiddle )


โซลูชัน jsFiddle ถูกตั้งค่าเป็น Mootools แทน jQuery และป้องกันไม่ให้ทำงานได้ พยายามแก้ปัญหานี้เพื่อดูพฤติกรรม: jsfiddle.net/N9tBx ฉันเพิ่มบันทึกการเปลี่ยนแปลงและคุณสามารถเห็นได้อย่างง่ายดายว่าเหตุการณ์การเปลี่ยนแปลงจะไม่เริ่มทำงานเมื่อปุ่มตัวเลือกที่เลือกไม่ถูกตรวจสอบเนื่องจากมีการตรวจสอบอีกครั้ง
Chris Porter

3
ไวยากรณ์อินพุต "[name = someRadioGroup]" ผิด ไวยากรณ์ที่ถูกต้องคือ: "input [name = someRadioGroup]: radio" ที่ควรทราบอีกอย่างคือวิธีนี้ใช้ได้เฉพาะกับ JQuery รุ่น 1.7.2 เท่านั้น มีการส่งข้อผิดพลาดสำหรับสิ่งนี้ ดู: jsfiddle.net/zn7q2/2สำหรับตัวอย่างของข้อผิดพลาดนี้หากคุณสงสัย
เรย์

@Ray: ข้อผิดพลาดเกิดขึ้นเฉพาะกับชื่อที่มีจุดอยู่ในตัว หากไม่มีจุดที่ใช้งานได้ให้ดูjsfiddle.net/zn7q2/4
Andomar

1
ตัวอย่างทำงานกับจุดถ้าคุณเปลี่ยนเป็น "input [name = 'DateSearchOptions.Test']" (ชื่อที่อยู่ระหว่างเครื่องหมายคำพูดเดี่ยว): jsfiddle.net/4hTxn
Nullpo

รหัส "if ($ (" # myCheckbox "). attr (" ทำเครื่องหมาย "))" ไม่ได้ผลสำหรับฉันฉันต้องใช้ "ถ้า ($ (" # myCheckbox ") คือ (": ถูกเลือก ") )"
Bartho Bernsmann

35
<input id='r1' type='radio' class='rg' name="asdf"/>
<input id='r2' type='radio' class='rg' name="asdf"/>
<input id='r3' type='radio' class='rg' name="asdf"/>
<input id='r4' type='radio' class='rg' name="asdf"/><br/>
<input type='text' id='r1edit'/>                  

ส่วน jquery

$(".rg").change(function () {

if ($("#r1").attr("checked")) {
            $('#r1edit:input').removeAttr('disabled');
        }
        else {
            $('#r1edit:input').attr('disabled', 'disabled');
        }
                    });

นี่คือDEMO


ผลงานชิ้นนี้ไม่เหมือนคนอื่น ๆ ที่ได้รับการทำเครื่องหมายว่าถูกต้อง: S
William Contestabile

+1 วิธีแก้ปัญหาของ Andomar ทำงานได้ แต่สิ่งนี้สมเหตุสมผลสำหรับฉัน การใช้ตัวเลือกคลาสป้องกันไม่ให้เปลี่ยนฟังก์ชั่นถ้าแบบฟอร์มมีการเปลี่ยนแปลงหรือมีจำนวนฟิลด์แบบไดนามิก Yay สำหรับการโหวต necro! (แม้ว่าตอนนี้ 2 ปีต่อมา jQuery แนะนำให้ใช้ prop () แทน attr (). api.jquery.com/prop )
Travis

8
ควรจะเปลี่ยนไป.attr('checked') .prop('checked')
Justin

1
ตัวอย่างที่ไม่ดีนี่ไม่ใช่วิธีการที่ทำ ดูคำตอบอื่น ๆ ของฉันสำหรับการปิดใช้งานองค์ประกอบ (ลบคุณลักษณะที่ไม่ถูกต้อง)
basic6 6

22

คุณสามารถผูกปุ่มตัวเลือกทั้งหมดในครั้งเดียวด้วยชื่อ:

$('input[name=someRadioGroup]:radio').change(...);

ตัวอย่างการทำงานที่นี่: http://jsfiddle.net/Ey4fa/


รูปแบบของสิ่งนี้คือ $ ("อินพุตของฟอร์ม: วิทยุ") เปลี่ยนแปลง (... ); และทดสอบเสาเงื่อนไขเงื่อนไขปุ่มเฉพาะ ('เลือก') สิ่งนี้มีประโยชน์มากเมื่อใช้ RadioButtonList แบบไดนามิกใน ASP.NET
Terence Golla



0

สมมติว่าปุ่มตัวเลือกเหล่านั้นอยู่ภายใน a divที่มี ID radioButtonsและปุ่มตัวเลือกมีชื่อเดียวกัน (ตัวอย่างcommonName) จากนั้น:

$('#radioButtons').on('change', 'input[name=commonName]:radio', function (e) {
    console.log('You have changed the selected radio button!');
});

0

changeเหตุการณ์ไม่ยิงไม่เลือกเป็นพฤติกรรมที่ต้องการ คุณควรเรียกใช้ตัวเลือกเหนือกลุ่มวิทยุทั้งหมดแทนที่จะเป็นเพียงปุ่มตัวเลือกเดียว และกลุ่มวิทยุของคุณควรมีชื่อเหมือนกัน (มีค่าต่างกัน)

พิจารณารหัสต่อไปนี้:

$('input[name="job[video_need]"]').on('change', function () {
    var value;
    if ($(this).val() == 'none') {
        value = 'hide';
    } else {
        value = 'show';
    }
    $('#video-script-collapse').collapse(value);
});

ฉันมีกรณีการใช้งานเช่นเดียวกับคุณคือการแสดงกล่องอินพุตเมื่อเลือกปุ่มตัวเลือก ถ้าเหตุการณ์ถูกไล่ออกจากการยกเลิกการเลือกฉันก็จะได้รับ 2 เหตุการณ์ในแต่ละครั้ง


0

ปัญหาเดียวกันที่นี่ทำงานได้ดี:

$('input[name="someRadioGroup"]').change(function() {
    $('#r1edit:input').prop('disabled', !$("#r1").is(':checked'));
});

-1

ด้วย Ajax สำหรับฉันทำงาน:

Html:

<div id='anID'>
 <form name="nameOfForm">
            <p><b>Your headline</b></p>
            <input type='radio' name='nameOfRadio' value='seed' 
             <?php if ($interviewStage == 'seed') {echo" checked ";}?> 
            onchange='funcInterviewStage()'><label>Your label</label><br>
 </form>
</div>

javascript:

 function funcInterviewStage() {

                var dis = document.nameOfForm.nameOfRadio.value;

                //Auswahltafel anzeigen
                  if (dis == "") {
                      document.getElementById("anID").innerHTML = "";
                      return;
                  } else { 
                      if (window.XMLHttpRequest) {
                          // code for IE7+, Firefox, Chrome, Opera, Safari
                          xmlhttp = new XMLHttpRequest();
                      } else {
                          // code for IE6, IE5
                          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                      }
                      xmlhttp.onreadystatechange = function() {
                          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                              document.getElementById("anID").innerHTML = xmlhttp.responseText;
                          }
                      }
                      xmlhttp.open("GET","/includes/[name].php?id="+dis,true);
                      xmlhttp.send();
                  }
              }  

และ php:

//// Get Value
$id = mysqli_real_escape_string($db, $_GET['id']);

//// Insert to database
$insert = mysqli_query($db, "UPDATE [TABLE] SET [column] = '$id' WHERE [...]");

//// Show radio buttons again
$mysqliAbfrage = mysqli_query($db, "SELECT [column] FROM [Table] WHERE [...]");
                  while ($row = mysqli_fetch_object($mysqliAbfrage)) {
                    ...
                  }
                  echo" 
                  <form name='nameOfForm'>
                      <p><b>Your headline</b></p>
                      <input type='radio' name='nameOfRadio' value='seed'"; if ($interviewStage == 'seed') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Yourr Label</label><br>
                      <input type='radio' name='nameOfRadio' value='startup'"; if ($interviewStage == 'startup') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Your label</label><br>

                  </form> ";

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