当前位置: 首页 > 知识库问答 >
问题:

如何用Document.QuerySelectorAll()动态选择元素进行函数调用?

钱澄邈
2023-03-14

我一直在做这把小提琴:

https://jsfidle.net/j1vrb7to/165/

那把小提琴的密码是这样的:

HTML:

<div id="CalculationContainer">
  <input type="numbers" class="form-control new-tuition" /> <br />
  <input type="numbers" class="form-control new-tuition" /> <br />
  <input type="numbers" class="form-control new-tuition" /><br /><br />
  <input type="numbers" id="new-tuition-total" disabled="disabled" /><br /> <br />

  <input type="numbers" class="form-control new-state" /> <br />
  <input type="numbers" class="form-control new-state" /> <br />
  <input type="numbers" class="form-control new-state" /><br /><br />
  <input type="numbers" id="new-state-total" disabled="disabled" />
</div>

JavaScript:

const NewTuitionInputs = document.querySelectorAll("div#CalculationContainer > input.new-tuition");
const NewStateInputs = document.querySelectorAll("div#CalculationContainer > input.new-state");

NewTuitionInputs.forEach(function(input) {
  input.onchange = function() {
    var total = 0;
    NewTuitionInputs.forEach(function(input) {
      total += parseInt(input.value);
    });
    document.getElementById("new-tuition-total").value = total;
  }
});

NewStateInputs.forEach(function(input) {
  input.onchange = function() {
    var total = 0;
    NewStateInputs.forEach(function(input) {
      total += parseInt(input.value);
    });
    document.getElementById("new-state-total").value = total;
  }
});

当用户在文本框中输入值时,我想更新另一个字段的值以显示正在运行的总计。最终,我将需要在我的表单上跟踪20+运行总数。不需要维护20+个函数,是否可以使用单个函数动态计算运行总数?下面是一些伪代码来演示我的想法:

var ThisInput = document.querySelectorAll("div#CalculationContainer > input.[INPUT_CLASS_PARAMETER_HERE]");

ThisInput.forEach(function(input) {
  input.onchange = function() {
    var total = 0;
    ThisInput.forEach(function(input) {
      total += parseInt(input.value);
    });
    document.getElementById("[DYNAMICALLY_CHOOSE_WHERE_TO_DISPLAY").value = total;
  }
});

共有1个答案

韶兴德
2023-03-14

您有一个约定,即输入有一个类,然后总数有一个带有该类名的id加上-total。您可以利用这一点来创建一个通用函数:

function trackTotals(className){
    var inputs = document.querySelectorAll(`div#CalculationContainer > input.${className}`);
    inputs.forEach(input => {
      input.addEventListener("change",()=>{
        var total = [...inputs].reduce((acc,i) => acc + (parseInt(i.value,10) || 0),0);
        document.getElementById(`${className}-total`).value = total;
      })
    })
}

然后用法是:

trackTotals("new-tuition");
trackTotals("new-state");
// whatever else that follows same conventions

下面是一个活生生的例子:

null

js prettyprint-override">trackTotals("new-tuition");
trackTotals("new-state");

function trackTotals(className){
    var inputs = document.querySelectorAll(`div#CalculationContainer > input.${className}`);
  inputs.forEach(input => {
    input.addEventListener("change",()=>{
      var total = [...inputs].reduce((acc,i) => acc + (parseInt(i.value,10) || 0),0);
      document.getElementById(`${className}-total`).value = total;
    })
  })
}
<div id="CalculationContainer">
<input type="numbers" class="form-control new-tuition"/> <br/>
<input type="numbers" class="form-control new-tuition"/> <br/>
<input type="numbers" class="form-control new-tuition"/><br/><br/>
<input type="numbers" id="new-tuition-total" disabled="disabled"/><br /><br />

<input type="numbers" class="form-control new-state"/> <br/>
<input type="numbers" class="form-control new-state"/> <br/>
<input type="numbers" class="form-control new-state"/><br/><br/>
<input type="numbers" id="new-state-total" disabled="disabled"/>
</div>
 类似资料:
  • 问题内容: 我正在尝试对通过document.querySelectorAll查询的选定元素进行循环,但是如何? 例如,我使用: 输出: 我的问题是,最后此方法返回了3个额外的项目。我该怎么做呢? 问题答案: 不建议对数组和类似数组的对象使用循环-您会明白为什么。不仅可以有数字索引项,例如属性或某些方法,还可以遍历所有这些项。使用任一 要么 如果数组中的某些元素可能是虚假的(不是您的情况),则无法

  • 我有一个选择元素,里面有多个选项: 对于这里看到的每个选项元素,我都有另一个select元素。基本上,我在一个选择元素中列出了一系列音乐流派,在它下面,是与每一个“主流派”相关的子流派。 我想做的是使子体裁只有在相对体裁被选中时才可见。例如,如果用户选择“Pop”,我想向他们显示包含Pop子类型的相关选择字段。 我的HTML标记实际上是由WordPress插件生成的,不幸的是,我无法编辑它。也就是

  • 问题内容: 该网站正在使用Prototype JS库。 页面加载后,它立即执行Ajax请求,该请求会拉出并显示页面的更多元素。 我需要能够选择那些动态创建的元素并使用method 隐藏它们。 我尝试使用选择和隐藏它们,但是这段代码没有“看到”动态元素。 我看到Prototype有方法,但是我不确定应该为我指定哪个Event?我尝试了事件“加载”,但没有成功。 我将不胜感激如何解决此问题的任何提示。

  • 问题内容: 我有以下代码: 我怎么能叫和动态? 例如: 我使用了大括号,因为这是我以前在PHP中使用的方式,但是显然不起作用。 如何使用Python做到这一点? 问题答案: 如果不想使用并且不想创建单独的模块和/或类来封装要动态调用的函数,则可以将它们作为当前模块的属性来调用:

  • 我正在与Javascript、Mocha、Chai和SinonJ合作。我想做的是监视一个“equals”方法,该方法由另一个方法“compareUsingOperator”动态调用。下面的代码显示了我的类“StringComparator”,它有两个方法“equals”和“compareUsingOperator”。 这是我的单元测试: 在我的单元测试中,我在“equals”方法上设置了一个间谍,

  • 问题内容: 我有一个GWT应用程序,正在尝试使用Selenium编写一些测试。 我正在使用XPath来标识测试页面上的元素。使用将无效,因为这些值是由GWT自动生成的,并且可以更改。当我意识到我可以按其标签找到按钮时,事情进展顺利,如下所示: 但是,当我开始运行多个测试时,我开始遇到问题。我意识到问题是,一旦Javascript生成的GWT应用程序的所有不同“页面”都保留在HTML中的隐藏元素中。