【问题标题】:Combinig output of 2 function in javascript在javascript中结合2个函数的输出
【发布时间】:2020-02-17 00:30:10
【问题描述】:

我对 Javascript(biopython 背景)比较陌生,我正在尝试向网站添加一个简单的功能。

本质上,我需要接受 4 种类型菜单的用户输入(复选框),然后将所选菜单的值 ($) 的总和乘以天数和人(用户使用文本字段输入)。

以下是代码的 HTML 和 Javascript 部分

function multiply() {
  var n_ppl = document.getElementsByName('people')[0].value;
  var n_days = document.getElementsByName('days')[0].value;
  return var out = n_ppl * n_days; 
}
  
function totalIt() {
  var n_ppl = document.getElementsByName('people')[0].value;
  var n_days = document.getElementsByName('days')[0].value;
  var input = document.getElementsByName("product");
  var total = 0;
  for (var i = 0; i < input.length; i++) {
    if (input[i].checked) {
      total += parseInt(input[i].value);
    }
  return var price = total
}

  // not sure how can I get - var final = total * out
  // after I get it I can finally do - document.getElementsByName("total")[0].value = "$" + final.toFixed(2);
<br> Breakfast <input name="product" value="12" type="checkbox" onclick="totalIt()" /> <br>
<br> First Meal <input name="product" value="20" type="checkbox" onclick="totalIt()" /> <br>
<br> Second Meal <input name="product" value="15" type="checkbox" onclick="totalIt()" /> <br>
<br> Craft Service <input name="product" value="10" type="checkbox" onclick="totalIt()" /> <br>
<br> Number of People <input type="text" name="people"> <br>
<br> Number of Days <input type="text" name="days"> <br>
<br> Total: <input value="$0.00" readonly="readonly" type="text" name="total" />

对于我的 Python 风格,我提前向所有 Web 开发人员道歉。

我还应该提到,这两个函数分别工作得很好,但即使不尝试将它们的输出相乘(即即使它们的代码彼此相邻),也没有任何作用。 我将非常感谢您的帮助!

【问题讨论】:

  • 来自java tag description:“Java(不要与 JavaScript 或 JScript 或 JS 混淆)...”。来自javascript tag description:“JavaScript(不要与 Java 混淆)...
  • Java 和 Javascript 是完全不同的语言。您的问题中没有实际提及 Java,因此您不应将其标记为 [java]。 (为什么?因为不正确的标签会浪费人们的时间。)
  • @RokoC.Buljan "" 是一个错字。并且类型也应该是“文本”,抱歉
  • 你应该使用&lt;label&gt;s
  • return var price = total

标签: javascript html checkbox textfield


【解决方案1】:
  • 您只需要一个函数来迭代您的输入。
  • 不要使用内联 JavaScript,这是不良编码习惯的标志,会使应用程序难以调试。将您的 JS 放在一个地方并使用Element.addEventListener()
  • 使用Node.querySelector()Node.querySelectorAll()
  • 在处理相似名称时使用name="product[]" 语法。这将作为值数组提交给后端。
  • 您可以使用 Array.prototype.reduce() 将所有 '[name="product[]"]:checked' chechboxes 值减少(累积)为单个整数
  • &lt;script&gt; 代码放在结束&lt;/body&gt; 标记之前

const EL_menu  = document.querySelector("#menu");

const calcPrice = evt => {

  const price = [...EL_menu.querySelectorAll('[name="product[]"]:checked')]
    .reduce((n, el) => (n += +el.value, n), 0);
    
  const nPers = +EL_menu.querySelector('[name="people"]').value || 1;
  const nDays = +EL_menu.querySelector('[name="days"]').value || 1;
  const total = price * nPers * nDays;
  
  EL_menu.querySelector("[name=total]").value = `\$${total.toFixed(2)}`;
}

EL_menu.querySelectorAll("input").forEach(el => el.addEventListener('input', calcPrice));
#menu label { display: block; }
<div id="menu">
  <label><input type="checkbox" name="product[]" value="12"> Breakfast</label>
  <label><input type="checkbox" name="product[]" value="20"> First Meal</label>
  <label><input type="checkbox" name="product[]" value="15"> Second Meal</label>
  <label><input type="checkbox" name="product[]" value="10"> Craft Service</label>
  <label><input type="number" name="people" value="1" min="1"> Number of People</label>
  <label><input type="number" name="days" value="1" min="1"> Number of Days</label><br>
  Total: <input type="text" name="total" value="$0.00" readonly="readonly">
</div>

【讨论】:

  • 感谢@RokoC.Buljan 的帮助!我还有很长的路要学。但我还有一个小问题。当我在这里运行代码 sn-p 时,它工作得很好,但是当我将它添加到我的网站时,功能就消失了。这是什么原因造成的?
  • 不客气@duda13 嗯,我怎么知道?如果有任何错误,请打开开发者控制台并阅读错误。如果您在控制台中没有错误,请确保您正确复制了示例,特别是 HTML 部分。
  • 开发者控制台中没有错误。似乎也正确复制了 HTML。我将在我的问题的答案中添加代码..
  • @duda13 你的问题很简单。 JS 代码应该在 关闭正文标记 &lt;/body&gt; 之前,以确保 DOM 已被读取并准备好被操作。如果你告诉 JS 解释器 “嘿,去找这个元素” - JS 解释器将停止它的执行,并且在当前 DOM 中找不到任何元素。相反,如果您让 DOM 解析器完成它的解析并构建 DOM 树,那么 JS 将了解每个元素的所有信息。
  • @duda13 看到这个jsBin demo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多