ตัวจัดการเหตุการณ์ OnChange สำหรับปุ่มตัวเลือก (INPUT type =“ radio”) ไม่ทำงานเป็นค่าเดียว


190

ฉันกำลังมองหาโซลูชันทั่วไปสำหรับสิ่งนี้

พิจารณาอินพุตประเภทวิทยุ 2 อันที่มีชื่อเดียวกัน เมื่อส่งแล้วสิ่งที่ถูกตรวจสอบจะกำหนดค่าที่ส่งมาพร้อมกับแบบฟอร์ม:

<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />

เหตุการณ์การเปลี่ยนแปลงจะไม่ทำงานเมื่อยกเลิกการเลือกปุ่มตัวเลือก ดังนั้นหากวิทยุที่มีค่า = "1" ถูกเลือกอยู่แล้วและผู้ใช้เลือกรายการที่สอง handleChange1 () จะไม่ทำงาน นี่นำเสนอปัญหา (สำหรับฉันต่อไป) ในกรณีที่ไม่มีเหตุการณ์ที่ฉันสามารถตรวจจับสิ่งที่เลือกได้

สิ่งที่ฉันต้องการเป็นวิธีแก้ปัญหาสำหรับเหตุการณ์ onchange สำหรับค่ากลุ่มช่องทำเครื่องหมายหรืออีกวิธีหนึ่งคือเหตุการณ์ oncheck ที่ตรวจจับไม่เพียง แต่เมื่อมีการตรวจสอบวิทยุ แต่ยังเมื่อไม่ได้ตรวจสอบ

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

PS
onclick ดูเหมือนจะเป็นเหตุการณ์ที่ดีกว่า (เบราว์เซอร์ข้าม) เพื่อระบุว่ามีการตรวจสอบวิทยุเมื่อใด แต่ก็ยังไม่สามารถแก้ปัญหาที่ไม่ได้ตรวจสอบได้

ฉันคิดว่ามันสมเหตุสมผลว่าทำไม onchange สำหรับประเภทช่องทำเครื่องหมายทำงานในกรณีเช่นนี้เนื่องจากมันเปลี่ยนค่าที่ส่งเมื่อคุณตรวจสอบหรือยกเลิกการตรวจสอบ ฉันหวังว่าปุ่มตัวเลือกจะทำงานเหมือนกับการเลือกองค์ประกอบของ SELECT แต่คุณจะทำอย่างไร ...

คำตอบ:


179

var rad = document.myForm.myRadios;
var prev = null;
for (var i = 0; i < rad.length; i++) {
    rad[i].addEventListener('change', function() {
        (prev) ? console.log(prev.value): null;
        if (this !== prev) {
            prev = this;
        }
        console.log(this.value)
    });
}
<form name="myForm">
  <input type="radio" name="myRadios"  value="1" />
  <input type="radio" name="myRadios"  value="2" />
</form>

นี่คือตัวอย่างของ JSFiddle: https://jsfiddle.net/crp6em1z/


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

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

1
@Oriol หรือใครก็ตามที่มีความรู้คุณสามารถยกตัวอย่างของ (1) การแคชภายนอกลูปหรือ (2) wrapper + การมอบหมายกิจกรรมหรือไม่
Matt Voda

10
@MattVoda โดยไม่ต้องเพิ่มประสิทธิภาพ ที่ใช้ร่วมกันฟังเหตุการณ์ ด้วยการมอบหมายกิจกรรม
Oriol

14
onclick ไม่ทำงานกับการเลือกแป้นพิมพ์คุณสามารถใช้rad[i].addEventListener('change', function(){ //your handler code })และมันจะใช้ได้กับทั้งเมาส์และแป้นพิมพ์
Juanmi Rodriguez

117

ฉันจะทำการเปลี่ยนแปลงสองอย่าง:

<input type="radio" name="myRadios" onclick="handleClick(this);" value="1" />
<input type="radio" name="myRadios" onclick="handleClick(this);" value="2" />
  1. ใช้onclickตัวจัดการแทนonchange- คุณกำลังเปลี่ยน "สถานะที่เลือก" ของอินพุตวิทยุไม่ใช่valueดังนั้นจึงไม่มีเหตุการณ์การเปลี่ยนแปลงเกิดขึ้น
  2. ใช้ฟังก์ชั่นเดียวและผ่านthisเป็นพารามิเตอร์ที่จะทำให้ง่ายต่อการตรวจสอบค่าที่เลือกไว้ในปัจจุบัน

ETA: พร้อมกับhandleClick()ฟังก์ชั่นของคุณคุณสามารถติดตามค่าดั้งเดิม / ค่าเก่าของวิทยุในตัวแปรที่กำหนดขอบเขตหน้า นั่นคือ:

var currentValue = 0;
function handleClick(myRadio) {
    alert('Old value: ' + currentValue);
    alert('New value: ' + myRadio.value);
    currentValue = myRadio.value;
}

var currentValue = 0;
function handleClick(myRadio) {
    alert('Old value: ' + currentValue);
    alert('New value: ' + myRadio.value);
    currentValue = myRadio.value;
}
<input type="radio" name="myRadios" onclick="handleClick(this);" value="1" />
<input type="radio" name="myRadios" onclick="handleClick(this);" value="2" />


ขอบคุณแม้ว่าสิ่งนี้จะไม่ได้แก้ไขปัญหาที่ต้องรับวิทยุที่ผ่านการตรวจสอบก่อนหน้านี้และคุณกำลังระบุบางสิ่งที่ผู้ใช้รายอื่นได้กล่าวถึงไปแล้วซึ่งต้องใช้ "onclick" แทน "onchange" จริง ๆ แล้วฉันรู้เรื่องนี้มาตั้งแต่ต้น แต่ฉันต้องการที่จะให้ความสนใจกับความจริงที่ว่า onchange ไม่ทำงานตามที่คาดหวังและฉันต้องการที่จะจัดการมันได้ดีขึ้น
แมทธิว

1
คุณใช้ JavaScript ใช่ไหม ดังนั้นทำไมไม่เพียงรักษาตัวแปรที่เก็บปุ่มตัวเลือกที่รู้จักล่าสุด หากคุณใช้ตัวจัดการเดียวคุณสามารถตรวจสอบค่าที่เก็บไว้นี้ก่อนที่คุณจะเขียนทับด้วยค่าใหม่ +1
jmort253

13
@ Matthew: onclickตัวจัดการนั้นตั้งชื่อได้ไม่ดี - มันจัดการกับเหตุการณ์ของการเลือกปุ่มตัวเลือกไม่ว่าจะเป็นปุ่มคลิกสัมผัสหรือเปิดใช้งานโดยกดปุ่ม "enter" บนแป้นพิมพ์ onchangeจัดการไม่เหมาะสมในกรณีนี้ตั้งแต่ค่าของการป้อนข้อมูลที่ไม่เปลี่ยนแปลงเพียงการตรวจสอบ / แอตทริบิวต์ไม่ถูกตรวจสอบ ฉันได้เพิ่มสคริปต์ตัวอย่างเพื่อระบุค่าก่อนหน้า
เนทคุก

1
"onClick" จะไม่จัดการกับเหตุการณ์หากผู้ใช้ใช้แป้นพิมพ์ (แท็บ + สเปซบาร์) เพื่อเลือกวิทยุ (และนี่เป็นวิธีปฏิบัติทั่วไปในรูปแบบขนาดใหญ่)
HoldOffHunger

+1 "onChange ()" ไม่ใช่เหตุการณ์ที่ใช้งานได้ใน ReactJS และนี่เป็นวิธีแก้ปัญหาเดียว ที่มา: github.com/facebook/react/issues/1471
HoldOffHunger

42

ตามที่คุณเห็นจากตัวอย่างนี้: http://jsfiddle.net/UTwGS/

HTML:

<label><input type="radio" value="1" name="my-radio">Radio One</label>
<label><input type="radio" value="2" name="my-radio">Radio One</label>

jQuery:

$('input[type="radio"]').on('click change', function(e) {
    console.log(e.type);
});

ทั้งเหตุการณ์clickและchangeถูกไล่ออกเมื่อเลือกตัวเลือกปุ่มตัวเลือก (อย่างน้อยในบางเบราว์เซอร์)

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

ดังนั้นประเด็นของฉันคือแม้ว่าchangeเหตุการณ์จะเป็นเบราว์เซอร์บางclickเหตุการณ์ก็ควรให้ความคุ้มครองที่คุณต้องการ


6
ใช่เพราะมีconsole.logคำสั่งในรหัสของฉันซึ่ง IE7 ไม่รองรับ คุณสามารถแจ้งเตือนใน IE หากคุณต้องการ
ฟิลิปวอลตัน

ขอบคุณ นี่ไม่ได้ระบุวิธีรับช่องทำเครื่องหมายที่เลือกไว้ก่อนหน้านี้ ขอบคุณมากฉันไม่ทราบว่า console.log ไม่ทำงานใน IE
แมทธิว

อย่าเพิ่มตัวจัดการเหตุการณ์เป็นสองเท่า - ในเบราว์เซอร์ที่ใช้ทั้งตัวจัดการเหตุการณ์clickและchangeตัวจัดการเหตุการณ์คุณจะต้องเรียกตัวจัดการสองครั้ง ในกรณีนี้เนื่องจาก @Matthew เกี่ยวข้องกับค่าก่อนหน้าซึ่งอาจนำไปสู่ผลกระทบที่ไม่ดี
Nate Cook

3
@NateCook คุณพลาดจุดตัวอย่างของฉันไปอย่างชัดเจน ฉันแสดงให้เห็นว่าเมื่อใดก็ตามที่มีการเปลี่ยนเหตุการณ์การเปลี่ยนแปลงเหตุการณ์การคลิกก็จะเริ่มขึ้น เพียงเพราะฉันใช้ทั้งสองเหตุการณ์ในตัวอย่างของฉันไม่ได้หมายความว่าฉันกำลังโปรโมต ฉันคิดว่าการลงคะแนนเสียงของคุณไม่ถูกต้อง
ฟิลิปวอลตัน

แต่คุณกำลังโปรโมตมัน - คำตอบดั้งเดิมของคุณบอกว่า "ดังนั้นประเด็นของฉันคือแม้ว่าเหตุการณ์การเปลี่ยนแปลงนั้นจะเกิดขึ้นกับเบราว์เซอร์บางส่วนเหตุการณ์การคลิกควรให้ความคุ้มครองที่คุณต้องการเป็นทางเลือกและคุณสามารถใช้การเปลี่ยนแปลงในเบราว์เซอร์ ที่สนับสนุนมัน " clickเป็นตัวจัดการที่ถูกต้องที่นี่และมีเพียงสิ่งเดียวที่คุณต้องการ การแก้ไขของคุณชี้แจงอย่างชัดเจนดังนั้นฉันจึงลบการลงคะแนนของฉัน
Nate Cook

10

แล้วการใช้เหตุการณ์การเปลี่ยนแปลงของ Jquery ล่ะ?

$(function() {
    $('input:radio[name="myRadios"]').change(function() {
        if ($(this).val() == '1') {
            alert("You selected the first option and deselected the second one");
        } else {
            alert("You selected the second option and deselected the first one");
        }
    });
});

jsfiddle: http://jsfiddle.net/f8233x20/


$(this).val()ยังสามารถถูกแทนที่ด้วยจาวาสคริปต์ดั้งเดิมe.currentTarget.valueโดยที่ e คือวัตถุของเหตุการณ์ที่ส่งผ่านฟังก์ชันการโทรกลับ
Eric

6

คุณสามารถดูได้ที่นี่: http://www.w3schools.com/jsref/event_onchange.asp แอตทริบิวต์ onchange ไม่รองรับปุ่มตัวเลือก

คำถาม SO แรกที่เชื่อมโยงโดยคุณให้คำตอบ: ใช้onclickเหตุการณ์แทนและตรวจสอบสถานะปุ่มตัวเลือกด้านในของฟังก์ชันที่ทริกเกอร์


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

ปุ่มตัวเลือกที่คลิกจะถูกตรวจสอบกลุ่มอื่น ๆ ในกลุ่มเดียวกันจะไม่ถูกตรวจสอบ หรือคุณสามารถวนซ้ำปุ่มตัวเลือกทั้งหมดของกลุ่มนั้นและตรวจสอบสถานะได้ หากคุณให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณต้องการทำกับปุ่มตัวเลือกมันจะง่ายกว่าที่จะบอกคุณว่าจะดำเนินการอย่างไร
Constantin Groß

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

@gsnedders onclick ดูเหมือนว่าจะทำงานผ่านการป้อนข้อมูลด้วยแป้นพิมพ์ในเบราว์เซอร์ส่วนใหญ่แม้ว่า - Firefox, IE, Safari, Chrome มันแปลกที่มันจะทำสิ่งที่ onchange ควรจะทำ แต่มันก็เป็นเช่นนั้น ฉันสงสัยว่ามันใช้งานได้กับแพลตฟอร์มมือถืออย่างไร
แมทธิว

1
w3schools สำหรับ 1 และไม่ได้แก้ไขปัญหาทั้งหมดสำหรับ 2 ซึ่งเป็นวิธีการรับวิทยุที่เลือกไว้ก่อนหน้านี้ 2 เป็นคำถามที่สำคัญที่สุดในใจ
แมทธิว

6

ฉันไม่คิดว่าจะมีวิธีอื่นใดแล้วจัดเก็บสถานะก่อนหน้า นี่คือทางออกของ jQuery

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript">
    var lastSelected;
    $(function () {
        //if you have any radio selected by default
        lastSelected = $('[name="myRadios"]:checked').val();
    });
    $(document).on('click', '[name="myRadios"]', function () {
        if (lastSelected != $(this).val() && typeof lastSelected != "undefined") {
            alert("radio box with value " + $('[name="myRadios"][value="' + lastSelected + '"]').val() + " was deselected");
        }
        lastSelected = $(this).val();
    });
</script>

<input type="radio" name="myRadios" value="1" />
<input type="radio" name="myRadios" value="2" />
<input type="radio" name="myRadios" value="3" />
<input type="radio" name="myRadios" value="4" />
<input type="radio" name="myRadios" value="5" />

หลังจากคิดเพิ่มอีกนิดหน่อยฉันตัดสินใจกำจัดตัวแปรและเพิ่ม / ลบคลาส นี่คือสิ่งที่ฉันได้รับ: http://jsfiddle.net/BeQh3/2/


1
ฉันคิดเกี่ยวกับการใช้ jQuery และมีอีกมากที่สามารถทำได้ คุณสามารถผูกเหตุการณ์ที่กำหนดเองบางอย่างสำหรับการตรวจสอบและไม่ได้ตรวจสอบและแม้กระทั่งการตรวจสอบ quirks เบราว์เซอร์ข้าม ฟังดูเหมือนเป็นความคิดที่ดีสำหรับปลั๊กอิน
แมทธิว

ขอบคุณ ฉันชอบ jQuery แต่ฉันไม่สามารถใช้งานได้ในกรณีนี้
แมทธิว

jQuery ไม่พร้อมใช้งานสำหรับคุณ
jmort253

1
หาก jQuery ใช้งานไม่ได้กับฉันฉันจะหางานอื่น
เอเดรียนคาร์

5

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

หากคุณต้องการระบุปุ่มตัวเลือกก่อนหน้าคุณต้องวนซ้ำmousedownเหตุการณ์

var radios = document.getElementsByName("myRadios");
var val;
for(var i = 0; i < radios.length; i++){
    if(radios[i].checked){
        val = radios[i].value;
    }
}

เห็นสิ่งนี้: http://jsfiddle.net/diode/tywx6/2/


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

5

เก็บวิทยุที่ตรวจสอบก่อนหน้านี้ไว้ในตัวแปร:
http://jsfiddle.net/dsbonev/C5S4B/

HTML

<input type="radio" name="myRadios" value="1" /> 1
<input type="radio" name="myRadios" value="2" /> 2
<input type="radio" name="myRadios" value="3" /> 3
<input type="radio" name="myRadios" value="4" /> 4
<input type="radio" name="myRadios" value="5" /> 5

JS

var changeHandler = (function initChangeHandler() {
    var previousCheckedRadio = null;

    var result = function (event) {
        var currentCheckedRadio = event.target;
        var name = currentCheckedRadio.name;

        if (name !== 'myRadios') return;

        //using radio elements previousCheckedRadio and currentCheckedRadio

        //storing radio element for using in future 'change' event handler
        previousCheckedRadio = currentCheckedRadio;
    };

    return result;
})();

document.addEventListener('change', changeHandler, false);

รหัส JS ตัวอย่าง

var changeHandler = (function initChangeHandler() {
    var previousCheckedRadio = null;

    function logInfo(info) {
        if (!console || !console.log) return;

        console.log(info);
    }

    function logPrevious(element) {
        if (!element) return;

        var message = element.value + ' was unchecked';

        logInfo(message);
    }

    function logCurrent(element) {
        if (!element) return;

        var message = element.value + ' is checked';

        logInfo(message);
    }

    var result = function (event) {
        var currentCheckedRadio = event.target;
        var name = currentCheckedRadio.name;

        if (name !== 'myRadios') return;

        logPrevious(previousCheckedRadio);
        logCurrent(currentCheckedRadio);

        previousCheckedRadio = currentCheckedRadio;
    };

    return result;
})();

document.addEventListener('change', changeHandler, false);

ขอบคุณ ฉันอาจใช้ซอเพิ่มขึ้นเล็กน้อยและเก็บวิทยุเอง วิธีนี้เมื่อค่าเปลี่ยนแปลงคุณมีการอ้างอิงถึงวิทยุที่เลือกไว้ก่อนหน้านี้แทนที่จะเป็นค่า
Matthew

@ Matthew จริง ๆ แล้วซอที่ฉันแบ่งปันได้เก็บองค์ประกอบวิทยุไม่ใช่ค่าเท่านั้น ค่าถูกบันทึกเพื่อแสดงวัตถุประสงค์ของรหัส แต่ไม่ได้เก็บไว้สำหรับการใช้งานในภายหลัง ฉันกำลังแก้ไขชื่อตัวแปรให้ชัดเจนยิ่งขึ้น: previousChecked -> previousCheckedRadio, นั่น -> currentCheckedRadio;
Dimitar Bonev

ขอบคุณ นี่เป็นทางออกที่ดียกเว้นการใช้เหตุการณ์การเปลี่ยนแปลงที่ไม่ทำงานข้ามเบราว์เซอร์อย่างเหมาะสม หากคุณใช้การคลิกแทนจะเป็นการดีกว่า
แมทธิว

5

ฉันรู้ว่านี่เป็นปัญหาเก่า แต่โค้ดขนาดสั้นนี้เหมาะกับฉัน บางทีบางคนในอนาคตอาจพบว่ามีประโยชน์:

<h2>Testing radio functionality</h2>
<script type="text/javascript">var radioArray=[null];</script>
<input name="juju" value="button1" type="radio" onclick="radioChange('juju','button1',radioArray);" />Button 1
<input name="juju" value="button2" type="radio" onclick="radioChange('juju','button2',radioArray);" />Button 2
<input name="juju" value="button3" type="radio" onclick="radioChange('juju','button3',radioArray);" />Button 3
<br />

<script type="text/javascript">
function radioChange(radioSet,radioButton,radioArray)
  {
  //if(radioArray instanceof Array) {alert('Array Passed');}
  var oldButton=radioArray[0];
  if(radioArray[0] == null)
    {
    alert('Old button was not defined');
    radioArray[0]=radioButton;
    }
  else
    {
    alert('Old button was set to ' + oldButton);
    radioArray[0]=radioButton;
    }
  alert('New button is set to ' + radioArray[0]);
  }
</script>

1
หากคุณเพิ่มonkeydown="radioChange('juju','button1',radioArray);"คุณยังสามารถจับภาพเมื่อผู้ใช้ใช้พื้นที่ในการตรวจสอบวิทยุ
Matthew

2

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


2
<input type="radio" name="brd" onclick="javascript:brd();" value="IN">   
<input type="radio" name="brd" onclick="javascript:brd();" value="EX">` 
<script type="text/javascript">
  function brd() {alert($('[name="brd"]:checked').val());}
</script>

2

หากคุณต้องการหลีกเลี่ยงสคริปต์แบบอินไลน์คุณสามารถฟังเหตุการณ์การคลิกทางวิทยุได้ สามารถทำได้ด้วย Javascript ธรรมดาโดยฟังเหตุการณ์คลิก

for (var radioCounter = 0 ; radioCounter < document.getElementsByName('myRadios').length; radioCounter++) {
      document.getElementsByName('myRadios')[radioCounter].onclick = function() {
        //VALUE OF THE CLICKED RADIO ELEMENT
        console.log('this : ',this.value);
      }
}

2

คุณสามารถเพิ่มสคริปต์ JS ต่อไปนี้

<script>
    function myfunction(event) {
        alert('Checked radio with ID = ' + event.target.id);
    }
    document.querySelectorAll("input[name='gun']").forEach((input) => {
        input.addEventListener('change', myfunction);
    });
</script>

1

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

<input ID="TIPO_INST-0" Name="TIPO_INST" Type="Radio" value="UNAM" onchange="convenio_unam();">UNAM

<script type="text/javascript">
            function convenio_unam(){
                if(this.document.getElementById('TIPO_INST-0').checked){
                    $("#convenio_unam").hide();
                }else{
                    $("#convenio_unam").show(); 
                }                               
            }
</script>

ฉันคิดว่านี่ควรเป็นคำตอบทันทีที่ได้รับการสนับสนุน
Leo

0

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

function AdjustRadios(which) 
{
    if(which==1)
         document.getElementById("rdpPrivate").checked=false;
    else if(which==2)
         document.getElementById("rdbPublic").checked=false;
}

0

ง่ายที่สุดและเต็มไปด้วยพลัง

อ่านอินพุตวิทยุเท่านั้นโดยใช้ getAttribute

document.addEventListener('input',(e)=>{

if(e.target.getAttribute('name')=="myRadios")
console.log(e.target.value)
})
<input type="text"  value="iam text" /> 
<input type="radio" name="myRadios" value="1" /> 1
<input type="radio" name="myRadios" value="2" /> 2

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