【问题标题】:My javascript code won't push elements to my array and I can't figure out why?我的 javascript 代码不会将元素推送到我的数组中,我不知道为什么?
【发布时间】:2021-03-07 23:09:59
【问题描述】:

所以我的代码背后的基本思想是这样的。

有一个可供选择的 7 个复选框和一个按钮,单击时应该会处理结果。

如果选中了两个框,则该函数应打印选择,如果选中的框数小于或大于 2,则应显示显示错误消息的警报。

为了跟踪复选框的数量,我运行了一个等于复选框数量的循环,并且每次array[index] == true,该给定复选框的值都应该添加到一个名为 selections 的数组中。

我的代码似乎无法将元素添加到数组选择中,我不明白为什么。

谁能帮我解释一下?

<fieldset>
  <legend>Side Dishes</legend>
  <h3>Pick two side dishes</h3>
  <input type="checkbox" name="sides" id="1" value="French Fries">French Fries<br />
  <input type="checkbox" name="sides" id="2" value="Baked Potato">Baked Potato<br />
  <input type="checkbox" name="sides" id="3" value="Cole Slaw">Cole Slaw<br />
  <input type="checkbox" name="sides" id="4" value="Garden Salad">Garden Salad<br />
  <input type="checkbox" name="sides" id="5" value="Mixed Vegetables">Mix 
  Vegetables<br />
  <input type="checkbox" name="sides" id="6" value="Macaroni and Cheese">Macaroni 
  and Cheese<br />
  <input type="checkbox" name="sides" id="7" value="Applesauce">Applesauce<br />
  <input type ="button" value = "Enter my side dish selections" id="sideselect"/>
</fieldset>
document.querySelector("#sideselect").addEventListener("click", validateSelection);

function validateSelection() {
  //Creates a list of check boxes to count true or false.
  var checkedSides = document.getElementsByName("sides");
  //Array to hold selected check boxes.
  var selections = [];
  console.log(checkedSides);
  console.log(checkedSides[1].value);

  for (var j = 0; j < checkedSides.length; j++) {
    //Inserts selected items into selections.
    if (checkedSides[j].check === true) {
      selections.push(checkedSides[j].value);
    }
  }

  console.log(selections);

  //Prints the first and second selected side to output if exactly 2 sides are selected.
  if (selections.length === 2) {
    document.querySelector("#side_one").textContent = selections[0];
    document.querySelector("#side_two").textContent = selections[1];
    //Tells the user they have selected too few items and clears selections.
  } else if (selections.length < 2) {
    alert("Please select at least 2 sides.");
    selections = [];
    //Tells the user they have selected too many items and clears selections. 
  } else if (selections.length > 2) {
    alert("Order is limited to 2 sides. Please adjust your selection.");
    selections = [];
  }
}

【问题讨论】:

  • checkedSides[j].check === true 应该是 checkedSides[j].checked。我建议你改用 TypeScript 来捕捉这些错误。
  • 我建议了解 DOM 元素及其属性比学习 TypeScript 更有价值——当然,TypeScript 可能有助于避免这些简单的错误——但是,你学到了什么?什么都没有
  • 非常复杂的表单编码方式......
  • @Bravo 随心所欲地学习 DOM 元素属性并不是很好地利用程序员的时间。使用 TypeScript 之类的语言和 IDE 会在提示时为您列出正确的属性(IntelliSense、代码完成等)是一种快乐的媒介。
  • @Dai - 我们的意见不同:p

标签: javascript html arrays loops push


【解决方案1】:

对不起大家,这是我的一个非常简单的错字 .check 我应该有 .checked 我的代码在哪里打印为 [if (checkedSides[j].check === true)]。

【讨论】:

    【解决方案2】:

    最简单的方法...(?)

    const myForm = document.forms['my-form']
      ;
    myForm.onsubmit = evt =>
      {
      evt.preventDefault()  // disable submit
      
      let selections =      // get Selections
        [...myForm.sides].reduce((r,s)=>  
            {
            if (s.checked) r.push(s.value)
            return r
            },[])
    
      myForm.side_one.value = (selections.length===2) ? selections[0] : ''
      myForm.side_two.value = (selections.length===2) ? selections[1] : ''
    
      if (selections.length < 2) alert("Please select at least 2 sides.")
      if (selections.length > 2) alert("Order is limited to 2 sides. Please adjust your selection.")
      }
    <form name="my-form">
      <fieldset>
        <legend>Side Dishes</legend>
        <h3>Pick two side dishes</h3>
    
        <label> <input type="checkbox" name="sides" value="French Fries"        > French Fries        </label><br>
        <label> <input type="checkbox" name="sides" value="Baked Potato"        > Baked Potato        </label><br>
        <label> <input type="checkbox" name="sides" value="Cole Slaw"           > Cole Slaw           </label><br>
        <label> <input type="checkbox" name="sides" value="Garden Salad"        > Garden Salad        </label><br>
        <label> <input type="checkbox" name="sides" value="Mixed Vegetables"    > Mix Vegetables      </label><br>
        <label> <input type="checkbox" name="sides" value="Macaroni and Cheese" > Macaroni and Cheese </label><br>
        <label> <input type="checkbox" name="sides" value="Applesauce"          > Applesauce          </label><br>
      </fieldset>
    
      <br>
      <button type="submit">Enter my side dish selections</button>
      <br>  <br>
      <fieldset>
        <legend>choices</legend>
        -- <input type="text" name="side_one" readonly> <br>
        -- <input type="text" name="side_two" readonly> <br>
      </fieldset>
    </form>

    【讨论】:

      【解决方案3】:

      您可以使用 css Pseudo-classe 选择器":checked" 以使用.querySelectorAll 将检查的输入作为节点列表仅获取一个示例:

      document.querySelector("#sideselect").onclick = function() {
        let checkedSides = document.querySelectorAll("[name='sides']:checked");
        if(checkedSides.length > 2) {
          alert("Order is limited to 2 sides. Please adjust your selection.");
        }else if(checkedSides.length < 2) {
          alert("Please select at least 2 sides.");
        }else {
          // just for demonstration although there will be only two I like to use forEach :)
          checkedSides.forEach(checkedSide => console.log(checkedSide.value));
          // submit or do whatever with the data
        }
      }
      <fieldset>
        <legend>Side Dishes</legend>
        <h3>Pick two side dishes</h3>
        <input type="checkbox" name="sides" id="1" value="French Fries">French Fries<br />
        <input type="checkbox" name="sides" id="2" value="Baked Potato">Baked Potato<br />
        <input type="checkbox" name="sides" id="3" value="Cole Slaw">Cole Slaw<br />
        <input type="checkbox" name="sides" id="4" value="Garden Salad">Garden Salad<br />
        <input type="checkbox" name="sides" id="5" value="Mixed Vegetables">Mix 
        Vegetables<br />
        <input type="checkbox" name="sides" id="6" value="Macaroni and Cheese">Macaroni 
        and Cheese<br />
        <input type="checkbox" name="sides" id="7" value="Applesauce">Applesauce<br />
        <input type ="button" value = "Enter my side dish selections" id="sideselect"/>
      </fieldset>

      【讨论】:

        【解决方案4】:

        试试这个方法,在点击调用函数上声明计数器和数组,用for循环检查所有元素。

        如果选中 == true,则在数组中添加值或 id。

        如果您有任何问题,请告诉我。

        <fieldset>
                <legend>Side Dishes</legend>
                <h3>Pick two side dishes</h3>
                <input type="checkbox" name="sides" id="1" value="French Fries">French Fries<br />
                <input type="checkbox" name="sides" id="2" value="Baked Potato">Baked Potato<br />
                <input type="checkbox" name="sides" id="3" value="Cole Slaw">Cole Slaw<br />
                <input type="checkbox" name="sides" id="4" value="Garden Salad">Garden Salad<br />
                <input type="checkbox" name="sides" id="5" value="Mixed Vegetables">Mix 
                Vegetables<br />
                <input type="checkbox" name="sides" id="6" value="Macaroni and Cheese">Macaroni 
                and Cheese<br />
                <input type="checkbox" name="sides" id="7" value="Applesauce">Applesauce<br />
                <input type ="button"  value = "Enter my side dish selections" id="sideselect"/>
                </fieldset>
                <script>
                    
                    let sel =[];
                    let counter=0;
                    selection=()=>{
                        
                        for (let i = 1; i < 8; i++) {
                            let a = document.getElementById(i);
                            
                            if(a.checked ===true){
                                sel[counter] = a.value;
                                counter++;
                            }
                            
                        }
                        if(counter<3){
                        alert("You Selected 2 or less Items ");
                        }else{
                            console.log(sel);
                            
                        }
                    }
                    document.getElementById("sideselect").addEventListener("click", selection);
                </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-19
          • 2014-01-17
          • 2015-05-05
          • 2022-08-09
          • 2021-10-05
          • 2017-07-08
          • 1970-01-01
          相关资源
          最近更新 更多