鍍金池/ 問答/HTML/ 在文本框輸入固定數字時,選中多選框的某個元素,限制多選框的選中個數為什么沒有效果

在文本框輸入固定數字時,選中多選框的某個元素,限制多選框的選中個數為什么沒有效果?

題目描述

限制多選框的選中個數,用一個方法單獨寫出來,在文本框輸入數字選中多選框的某個元素時,到了該限制的時候沒有反應。

題目來源及自己的思路

來源:慕課網JavaScript的一道題目+我自己的一點想法。
思路:先判斷多選框是否選中,如果已經開始選中就調用限制多選框選中個數的方法,網上說要設置點擊多選框觸發(fā)方法,然后在該方法中將checked設置為false,但是文本框控制多選框不需要點擊多選框,所有不能觸發(fā)該方法,多選框用onclick方法將設置多選框的checked=false后,多選框元素還是被選中了,查了好多資料都沒有解決。

相關代碼

<body>

 <form>
      請選擇你愛好:<br>
      <input type="checkbox" name="hobby" id="hobby1">  音樂
      <input type="checkbox" name="hobby" id="hobby2">  登山
      <input type="checkbox" name="hobby" id="hobby3">  游泳
      <input type="checkbox" name="hobby" id="hobby4">  閱讀
      <input type="checkbox" name="hobby" id="hobby5">  打球
      <input type="checkbox" name="hobby" id="hobby6">  跑步 <br>
      <input type="button" value = "全選" onclick = "checkall();">
      <input type="button" value = "全不選" onclick = "clearall();">
      <p>請輸入您要選擇愛好的序號,序號為1-6:</p>
      <input id="wb" name="wb" type="text" >
      <input name="ok" type="button" value="確定" onclick = "checkone();">
    </form>
    <script type="text/javascript">
    function checkall(){
        //全選
        var hobby = document.getElementsByTagName("input");
          for(var i=0;i<hobby.length;i++){
          if(hobby[i].type=="checkbox"){      
           hobby[i].checked=true;
            }
          }
    }
    
    function clearall(){
        // 全不選
        var hobby = document.getElementsByName("hobby");
        for(var i=0;i<hobby.length;i++){
        if(hobby[i].checked==true){
            hobby[i].checked=false;
        }
      }    
        
    }
    
    function checkone(){
        //選一個
        var num=0;
        var j=document.getElementById("wb").value;
        var hobby=document.getElementsByName("hobby");
        if(j<=0||j>6){
            alert("請輸入正確的數字!");
        }else
        {
        hobby[j-1].checked=true;
        }
        for(var i=0;i<hobby.length;i++){
         if(hobby[i].checked==true){
            autoCheck("hobby",3);
         }
       }    
    }
    //  限制單個選中的最大個數
    function autoCheck(name,limit){
        var hobby=document.getElementsByName(name);
        function check()
        {
          var num=0;
          for(var i=0;i<hobby.length;i++)
          {
             if(hobby[i].checked){num++}
             if(num>limit)
             {
                return false;
             }
          }
          return true;
        }
        function checkedNum(){
           for(var i=0;i<hobby.length;i++){
            if(!check()){
                alert("只能選擇"+limit+"項哦!");
                hobby[i].checked=false;
                }
            }
        }
     }
    
    </script>
</body>

你期待的結果是什么?實際看到的錯誤信息又是什么?

期待:無論是點擊多選框還是在文本框中輸入數字控制多選框,到了限制條件時都無法再選中。
錯誤:文本框輸入數字控制多選框無法觸發(fā)限制多選框的方法,與多選框被點擊時觸發(fā)方法無法達到一致。

回答
編輯回答
礙你眼

在你原來的基礎上改了一點點

<form>
  請選擇你愛好:
  <br>
  <input type="checkbox" name="hobby" id="hobby1"> 音樂
  <input type="checkbox" name="hobby" id="hobby2"> 登山
  <input type="checkbox" name="hobby" id="hobby3"> 游泳
  <input type="checkbox" name="hobby" id="hobby4"> 閱讀
  <input type="checkbox" name="hobby" id="hobby5"> 打球
  <input type="checkbox" name="hobby" id="hobby6"> 跑步
  <br>
  <input type="button" value="全選" onclick="checkall();">
  <input type="button" value="全不選" onclick="clearall();">
  <p>請輸入您要選擇愛好的序號,序號為1-6:</p>
  <input id="wb" name="wb" type="text">
  <input name="ok" type="button" value="確定" onclick="checkone();">
</form>
<script type="text/javascript">
  function checkall() {
    //全選
    var hobby = document.getElementsByTagName("input");
    for (var i = 0; i < hobby.length; i++) {
      if (hobby[i].type == "checkbox") {
        hobby[i].checked = true;
      }
    }
  }

  function clearall() {
    // 全不選
    var hobby = document.getElementsByName("hobby");
    for (var i = 0; i < hobby.length; i++) {
      if (hobby[i].checked == true) {
        hobby[i].checked = false;
      }
    }

  }

  function checkone() {
    //選一個   
    var j = document.getElementById("wb").value;
    var hobby = document.getElementsByName('hobby');
    if (j <= 0 || j > 6) {
      alert("請輸入正確的數字!");
    } else
    if (autoCheck("hobby", 3, 'checkone')) {

      hobby[j - 1].checked = true;
    }

  }
  // 輸入時 限制單個選中的最大個數
  function autoCheck(name, limit, type) {
    var hobby = document.getElementsByName(name);
    if (type == 'checkone') {
      var num = 1;
    } else {
      var num = 0;
    }

    for (var i = 0; i < hobby.length; i++) {
      if (hobby[i].checked) {
        num++
      }
    }
    console.log(num)
    if (num <= limit) {
      return true;
    } else {
      alert('超限了親')
      return false;
    }
  }
  //  直接選擇時限制單個選中的最大個數
  function sigleCheck() {
    var hobby = document.getElementsByName('hobby');
    if (autoCheck("hobby", 3)) {
      for (var i = 0; i < hobby.length; i++) {
        hobby[i].onclick = function (e) {

          if (autoCheck("hobby", 3, 'sigleCheck')) {

            e.target.checked = true;
          } else {
            e.target.checked = false;
          }


        }


      }

    }
  }
  sigleCheck()

</script>
</body>
2017年4月1日 09:41
編輯回答
茍活

把你script里面的代碼替換成下面代碼即可實現需求,為了方便書寫直接我使用es6語法,需確保你的瀏覽器支持

const limit = 3;

const hobby = [].map.call(document.querySelectorAll("input[name='hobby']"), el => el);

const checkedLength = () => hobby.filter(el => el.checked).length;

hobby.forEach(el => {
  el.addEventListener('change', e => {
    if (checkedLength() > limit) {
      e.target.checked = false;
    }
  });
});

function checkall() {
  hobby.forEach(el => el.checked = true)
}

function clearall() {
  hobby.forEach(el => el.checked = false)
}

function checkone() {
  const index = document.getElementById("wb").value;
  if (index > 0 && index < 6) {
    const el = hobby[index - 1];
    if (!el.checked) {
      if (checkedLength() < limit) {
        el.checked = true;
      } else {
        alert("只能選擇" + limit + "項哦!");
      }
    }
  } else {
    alert("請輸入正確的數字!");
  }
}
2017年1月24日 20:22