【问题标题】:Multiple buttons using same function多个按钮使用相同的功能
【发布时间】:2023-03-18 11:44:02
【问题描述】:

我有多个按钮,我想在不同的相应输入中增加一个值。我能够让所有按钮工作,但它们只影响第一个输入。我意识到我可以为每个按钮写出三个不同的功能,但我知道有一种方法可以利用一个功能。提前感谢您的帮助!

以下代码供参考:

let submit = document.querySelectorAll(".submit");
let num = document.querySelector(".num");

submit.forEach((btn)=>{
  btn.addEventListener("click", increment);
});

let value = 0;

function increment(){
  value +=1;
  num.value = value;
}
<div class="container">

  <div class="main">

    <button class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"></input>     </div>

    <button class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"></input>     </div>

    <button class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"></input>     </div>

  </div>

</div>

【问题讨论】:

  • 您的increment() 函数中应该有一个event 变量。此事件有一个target 字段。尝试为每个按钮设置一个 ID,并使用此 ID 识别目标。
  • 选择下一个兄弟
  • &lt;input/&gt;标签是自闭合的,&lt;input&gt;&lt;/input&gt;是无效的HTML

标签: javascript


【解决方案1】:

选择next sibling 并选择输入。

const submit = document.querySelectorAll(".submit");

submit.forEach((btn) => {
  btn.addEventListener("click", increment);
});

function increment() {
  const inp = this.nextElementSibling.querySelector("input");
  inp.value = Number(inp.value) + 1;
}
<div class="container">

  <div class="main">

    <button type="button" class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"> </div>

    <button type="button" class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"> </div>


    <button type="button" class="submit">Submit</button>
    <div class="withinDiv"><input type="number" class="num" value="0"> </div>

  </div>

</div>

【讨论】:

  • 这很有效,我需要熟悉孩子和兄弟姐妹以及这个。再次感谢!
【解决方案2】:

我就是这样做的-基本上在您的“submit”按钮中创建属性(在本例中为“for”(请参阅​​编辑)),该属性将指向idinput 要递增.这为您提供了充分的灵活性,无论您拥有什么 html。

编辑

最好使用自定义属性,例如data-for,按钮没有for 属性,如下面的cmets 所示

let submit = document.querySelectorAll(".submit");


submit.forEach((btn)=>{
  btn.addEventListener("click", increment);
});



function increment(ev){
  let targetInputId = ev.target.getAttribute("data-for");
  let targetInput = document.getElementById(targetInputId);
  
  targetInput.value = parseInt(targetInput.value) + 1;
}
<div class="container">

  <div class="main">

    <button data-for="num1" class="submit">Submit</button>
    <div class="withinDiv"><input id="num1" type="number" class="num" value="0"></input>     </div>

    <button data-for="num2" class="submit">Submit</button>
    <div class="withinDiv"><input id="num2" type="number" class="num" value="0"></input>     </div>

    <button data-for="num3" class="submit">Submit</button>
    <div class="withinDiv"><input id="num3" type="number" class="num" value="0"></input>     </div>

  </div>

</div>

【讨论】:

  • Buttons don't have a for attribute,但您可以使用自定义的data-foobar (用更有意义的名称替换foobar
  • 他们没有,但你仍然可以使用它,是的,我实际上会做“data-for”,只是,你知道,直接从他们的头上输入 - 无论如何“只是例如"
  • 仅仅因为你可以,并不意味着你应该编写或建议人们编写无效的HTML
  • 好的,我来解决这个问题
  • 我知道我被打败了 :) 我相信这是一个更好的解决方案,因为如果将更多的兄弟姐妹添加到 HTML 中,它不会中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2011-04-18
  • 1970-01-01
  • 2020-10-25
  • 2018-06-18
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多