jquery นับจำนวนเลือก radio array อย่างน้อย 1 ตัว แต่ไม่เกิน 3
ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา jquery นับจำนวนเลือก radio array อย่างน้อย 1 ตัว แต่ไม่เกิน 3
jquery นับจำนวนเลือก radio array อย่างน้อย 1 ตัว แต่ไม่เกิน 3
<input type="radio" name="person_id[<?php echo $i;?>]" id="person_id<?php echo $i;?>" value="<?php echo $value['person_id'];?>">
เรดิโอ อาเรย์ ตัวนี้ เราจะเช็คยังไง ให้เลือกได้ไม่เกิน 3 ตัว ครับ
เรดิโอ อาเรย์ ตัวนี้ เราจะเช็คยังไง ให้เลือกได้ไม่เกิน 3 ตัว ครับ

คำแนะนำ และการใช้งาน
สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก
- ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
ความคิดเห็นที่
1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width" > <title>Ninenik.com</title> </head> <body> <input type= "checkbox" name= "myradio1" class = "myradioclass" value= "1" >1 <input type= "checkbox" name= "myradio2" class = "myradioclass" value= "2" >2 <input type= "checkbox" name= "myradio3" class = "myradioclass" value= "3" >3 <input type= "checkbox" name= "myradio4" class = "myradioclass" value= "4" >4 <input type= "checkbox" name= "myradio5" class = "myradioclass" value= "5" >5 <script> $( function (){ $( ".myradioclass" ).on( "click" , function (){ var checkLength = $( ".myradioclass:checked" ).length; if (checkLength>3){ return false; } }); }); </script> </body> </html> |
กำหนด class เข้าไปเพื่อใช้อ้างอิง แล้วนับจำนวนรายการที่ถูกเลือก หรือ checked

ความคิดเห็นที่
2
ขอบคุณค้าบบบ แจ่มเลย


ความคิดเห็นที่
3
จากเรดิโอนี้ แล้วถ้าเราจะบังคับว่า ต้องเลือกแบบต่อเนื่อง คนๆเดียวกัน และเวลาก็ต้องติดกันละครับ

ความคิดเห็นที่
4
ต้องอธิบายให้เห็นภาพชัดเจนกว่านี้ ถึงจะแนะนำได้ เช่น สมมติว่า เลือกแบบไหน ต้องเป็นแบบไหน อย่างคนแรกเลือก 8 โมงต้องเลือก 9 และ 10 ด้วยหรือไม่ แล้วคนที่สองตั้งเลือกไม่ซ้ำคนแรกหรือไ่ม่ อื่นๆ
>>> อัพเดท >>> 25-02-2024
------------------------------------------
แนวทางการเลือก 3 รายการติดๆ กัน
>>> อัพเดท >>> 25-02-2024
------------------------------------------
แนวทางการเลือก 3 รายการติดๆ กัน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width" > <title>Ninenik.com</title> </head> <body> <input type= "checkbox" name= "myradio1" class = "myradioclass" value= "1" >1 <input type= "checkbox" name= "myradio2" class = "myradioclass" value= "2" >2 <input type= "checkbox" name= "myradio3" class = "myradioclass" value= "3" >3 <input type= "checkbox" name= "myradio4" class = "myradioclass" value= "4" >4 <input type= "checkbox" name= "myradio5" class = "myradioclass" value= "5" >5 <script> $( function (){ $( ".myradioclass" ).on( "click" , function (){ $( ".myradioclass" ).prop( "checked" ,false); // ยกเลิกเลือกทั้งหมด let maxCheck = 3; // บังคับเลือก 3 รายการติด let totalObj = $( ".myradioclass" ).length; // ในกลุ่มมีทั้งหมด let indexObj = $( ".myradioclass" ).index(this); // ตัวแรกที่เลือกเป็นตัวที่ let startChek = indexObj; // กำหนดตัวแรกที่จะถูกเลือก if (totalObj-indexObj<maxCheck){ // ตรวจสอบว่าเป็นตัวท้ายๆ หรือไม่ // ถ้าเป็นตัวท้ายๆ คำนวณหาว่ายังขาดอีกเท่าไรถึงจะครบจำนวนบังคับเลือก let needObj = maxCheck-(totalObj-indexObj); startChek = indexObj-needObj; // หาตำแหน่งแรกเพื่อนับให้ครบจำนวน } let endCheck = startChek + maxCheck; // ตำแหน่งสุดท้ายที่จะเลือก for (let i=startChek;i<endCheck;i++){ // วนลูปเลือกรายการ $( ".myradioclass" ).eq(i).prop( "checked" ,true); } }); }); </script> </body> </html> |

ความคิดเห็นที่
5
โทษทีครับ เงื่อนไขคือ เลือกได้ไม่เกิน 3 กรณีที่เลือก 2 หรือ 3 ตัว ต้องเลือกชม.ติดๆกัน ในคอลัมภ์เดียวกันครับ

ความคิดเห็นที่
6
ดูตัวอย่างนี้เป็นแนวทาง
>>> อัพเดท >>> 25-02-2024
------------------------------------------
กรณีใช้หลายคอลัมน์ หรือหลายชุด ให้กำหนด class ให้กับ parent แล้วปรับโค้ดเป็นแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width" > <title>Ninenik.com</title> </head> <body> <input type= "radio" name= "myradio1" class = "myradioclass" value= "1" >1 <input type= "radio" name= "myradio2" class = "myradioclass" value= "2" >2 <input type= "radio" name= "myradio3" class = "myradioclass" value= "3" >3 <input type= "radio" name= "myradio4" class = "myradioclass" value= "4" >4 <input type= "radio" name= "myradio5" class = "myradioclass" value= "5" >5 <script> $( function (){ $( ".myradioclass" ).on( "click" , function (e){ let maxCheck = 3; // บังคับเลือก 3 รายการติด let totalObj = $( ".myradioclass" ).length; // ในกลุ่มมีทั้งหมด let indexObj = $( ".myradioclass" ).index(this); // ตัวที่เลือกตัวที่ let nearObj = []; // กำหนดไว้เก็บค่ารายการที่สามารถเลือกได้ let checkLength = $( ".myradioclass:checked" ).length; if (checkLength>3){ return false; } if (checkLength>1){ // ถ้าเริ่มเลือกตัวที่สองขึ้นไป // เป็นรายการแรก หรือรายการสุดท้ายหรือไม่ if ([0,totalObj-1].includes(indexObj)){ if (indexObj==0){ // เป็นรายการแรก nearObj = [indexObj+1]; // ตัวใกล้คือตัวถัดไป } else { // รายการสุดท้าย nearObj = [indexObj-1]; // ตัวใกล้คือตัวก่อนหน้า } } else { // ไม่ใช่รายการแรก และรายการสุดท้าย nearObj = [indexObj-1,indexObj+1]; // ตัวใกล้คือตัวที่อยู่ข้างๆ } let canCheck = false; // เริ่มต้นเลือกไม่ได้ $.map(nearObj,(i,o)=>{ if ($( ".myradioclass" ).eq(i).prop( "checked" )){ // ถ้ามีรายการใกล้ๆ ถูกเลือก รายการนั้นสามารถเลือกได้ canCheck = true; } }); return canCheck; } }); }); </script> </body> </html> |
>>> อัพเดท >>> 25-02-2024
------------------------------------------
กรณีใช้หลายคอลัมน์ หรือหลายชุด ให้กำหนด class ให้กับ parent แล้วปรับโค้ดเป็นแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width" > <title>Ninenik.com</title> </head> <body> <div class = "place_area" > <input type= "radio" name= "myradio1" class = "myradioclass" value= "1" >1 <input type= "radio" name= "myradio2" class = "myradioclass" value= "2" >2 <input type= "radio" name= "myradio3" class = "myradioclass" value= "3" >3 <input type= "radio" name= "myradio4" class = "myradioclass" value= "4" >4 <input type= "radio" name= "myradio5" class = "myradioclass" value= "5" >5 </div> <div class = "place_area" > <input type= "radio" name= "myradio12" class = "myradioclass" value= "1" >1 <input type= "radio" name= "myradio22" class = "myradioclass" value= "2" >2 <input type= "radio" name= "myradio32" class = "myradioclass" value= "3" >3 <input type= "radio" name= "myradio42" class = "myradioclass" value= "4" >4 <input type= "radio" name= "myradio52" class = "myradioclass" value= "5" >5 </div> <script> $( function (){ $( ".myradioclass" ).on( "click" , function (e){ const parentObj = $(this).parents( ".place_area" ); let maxCheck = 3; // บังคับเลือก 3 รายการติด let totalObj = parentObj.find( ".myradioclass" ).length; // ในกลุ่มมีทั้งหมด let indexObj = parentObj.find( ".myradioclass" ).index(this); // ตัวที่เลือกตัวที่ let nearObj = []; // กำหนดไว้เก็บค่ารายการที่สามารถเลือกได้ let checkLength = parentObj.find( ".myradioclass:checked" ).length; if (checkLength>3){ return false; } console.log(totalObj); if (checkLength>1){ // ถ้าเริ่มเลือกตัวที่สองขึ้นไป // เป็นรายการแรก หรือรายการสุดท้ายหรือไม่ if ([0,totalObj-1].includes(indexObj)){ if (indexObj==0){ // เป็นรายการแรก nearObj = [indexObj+1]; // ตัวใกล้คือตัวถัดไป } else { // รายการสุดท้าย nearObj = [indexObj-1]; // ตัวใกล้คือตัวก่อนหน้า } } else { // ไม่ใช่รายการแรก และรายการสุดท้าย nearObj = [indexObj-1,indexObj+1]; // ตัวใกล้คือตัวที่อยู่ข้างๆ } let canCheck = false; // เริ่มต้นเลือกไม่ได้ $.map(nearObj,(i,o)=>{ if (parentObj.find( ".myradioclass" ).eq(i).prop( "checked" )){ // ถ้ามีรายการใกล้ๆ ถูกเลือก รายการนั้นสามารถเลือกได้ canCheck = true; } }); return canCheck; } }); }); </script> </body> </html> |

ความคิดเห็นที่
7
ขอบคุณมากครับผม

ความคิดเห็นที่
9
ถ้าโครงสร้าง html ลักษณะนี้ อาจจะต้องใช้ data attribute มาช่วย เพื่อแยกกลุ่มของข้อมูล สมมติเช่น ใช้เป็นชื่อว่า set ก็จะเพิ่มเข้าไป
เป็น data-set="set1" จากนั้นก็เปลี่ยนโค้ดการอ้างอิงเล็กน้อย ก็น่าจะสามารถใช้ได้
เป็น data-set="set1" จากนั้นก็เปลี่ยนโค้ดการอ้างอิงเล็กน้อย ก็น่าจะสามารถใช้ได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width" > <title>Ninenik.com</title> </head> <body> <table> <tr> <td>Name 1</td> <td>Name 2</td> </tr> <tr> <td><input type= "radio" name= "myradio1" data-set= "set1" class = "myradioclass" value= "1" >1</td> <td><input type= "radio" name= "myradio12" data-set= "set2" class = "myradioclass" value= "1" >1</td> </tr> <tr> <td><input type= "radio" name= "myradio2" data-set= "set1" class = "myradioclass" value= "2" >2</td> <td><input type= "radio" name= "myradio22" data-set= "set2" class = "myradioclass" value= "2" >2</td> </tr> <tr> <td><input type= "radio" name= "myradio3" data-set= "set1" class = "myradioclass" value= "3" >3</td> <td><input type= "radio" name= "myradio32" data-set= "set2" class = "myradioclass" value= "3" >3</td> </tr> <tr> <td><input type= "radio" name= "myradio4" data-set= "set1" class = "myradioclass" value= "4" >4</td> <td><input type= "radio" name= "myradio42" data-set= "set2" class = "myradioclass" value= "4" >4</td> </tr> <tr> <td><input type= "radio" name= "myradio5" data-set= "set1" class = "myradioclass" value= "5" >5</td> <td><input type= "radio" name= "myradio52" data-set= "set2" class = "myradioclass" value= "5" >5</td> </tr> </table> <script> $( function (){ $( ".myradioclass" ).on( "click" , function (e){ let setID = $(this).data( "set" ); // ดึงข้อมูล กลุ่มที่กำหนด let maxCheck = 3; // บังคับเลือก 3 รายการติด let totalObj = $( "[data-set='" +setID+ "']" ).length; // ในกลุ่มมีทั้งหมด let indexObj = $( "[data-set='" +setID+ "']" ).index(this); // ตัวที่เลือกตัวที่ let nearObj = []; // กำหนดไว้เก็บค่ารายการที่สามารถเลือกได้ let checkLength = $( "[data-set='" +setID+ "']:checked" ).length; if (checkLength>3){ return false; } if (checkLength>1){ // ถ้าเริ่มเลือกตัวที่สองขึ้นไป // เป็นรายการแรก หรือรายการสุดท้ายหรือไม่ if ([0,totalObj-1].includes(indexObj)){ if (indexObj==0){ // เป็นรายการแรก nearObj = [indexObj+1]; // ตัวใกล้คือตัวถัดไป } else { // รายการสุดท้าย nearObj = [indexObj-1]; // ตัวใกล้คือตัวก่อนหน้า } } else { // ไม่ใช่รายการแรก และรายการสุดท้าย nearObj = [indexObj-1,indexObj+1]; // ตัวใกล้คือตัวที่อยู่ข้างๆ } let canCheck = false; // เริ่มต้นเลือกไม่ได้ $.map(nearObj,(i,o)=>{ if ($( "[data-set='" +setID+ "']" ).eq(i).prop( "checked" )){ // ถ้ามีรายการใกล้ๆ ถูกเลือก รายการนั้นสามารถเลือกได้ canCheck = true; } }); return canCheck; } }); }); </script> </body> </html> |
บทความแนะนำที่เกี่ยวข้อง | |
---|---|
การกำหนด selectors ด้วย jQuery แบบตัวกรอง Attribute | อ่าน 11,483 |
ประยุกต์รวมข้อมูลแถวในตาราง ด้วย jquery ร่วมกับ data attribute | อ่าน 10,823 |

ความคิดเห็นที่
10
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Ninenik.com</title>
</head>
<body>
<table>
<tr>
<td>Name 1</td>
<td>Name 2</td>
</tr>
<?php for($i=1;$i<=5;$i++){?>
<tr>
<td><input type="radio" name="myradio[<?php echo $i;?>]" data-set="set<?php echo $i;?>" class="myradioclass" value="1"><?php echo $i;?></td>
<td><input type="radio" name="myradio[<?php echo $i;?>]" data-set="set<?php echo $i;?>" class="myradioclass" value="2"><?php echo $i;?></td>
</tr>
<?php }?>
</table>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script>
$(function(){
$(".myradioclass").on("click",function(e){
let setID = $(this).data("set"); // ดึงข้อมูล กลุ่มที่กำหนด
let maxCheck = 3; // บังคับเลือก 3 รายการติด
let totalObj = $("[data-set='"+setID+"']").length; // ในกลุ่มมีทั้งหมด
let indexObj = $("[data-set='"+setID+"']").index(this); // ตัวที่เลือกตัวที่
let nearObj = []; // กำหนดไว้เก็บค่ารายการที่สามารถเลือกได้
let checkLength = $("[data-set='"+setID+"']:checked").length;
if(checkLength>3){
return false;
}
if(checkLength>1){ // ถ้าเริ่มเลือกตัวที่สองขึ้นไป
// เป็นรายการแรก หรือรายการสุดท้ายหรือไม่
if([0,totalObj-1].includes(indexObj)){
if(indexObj==0){ // เป็นรายการแรก
nearObj = [indexObj+1]; // ตัวใกล้คือตัวถัดไป
}else{ // รายการสุดท้าย
nearObj = [indexObj-1]; // ตัวใกล้คือตัวก่อนหน้า
}
}else{ // ไม่ใช่รายการแรก และรายการสุดท้าย
nearObj = [indexObj-1,indexObj+1]; // ตัวใกล้คือตัวที่อยู่ข้างๆ
}
let canCheck = false; // เริ่มต้นเลือกไม่ได้
$.map(nearObj,(i,o)=>{
if($("[data-set='"+setID+"']").eq(i).prop("checked")){
// ถ้ามีรายการใกล้ๆ ถูกเลือก รายการนั้นสามารถเลือกได้
canCheck = true;
}
});
return canCheck;
}
});
});
</script>
</body>
</html>


ขอบคุณทุกการสนับสนุน
![]()