javascript - 第三次是一个魅力......也许

标签 javascript

我仍在尝试从单元格收集信息,使用该信息执行函数,然后将结果返回到不同的单元格。我知道这是可能的,但我正在努力解决这个问题。我在这里收到的许多提示引导我找到了以我理解的方式表达的大量信息。我希望这种事能再次发生——这让我发疯。 以下代码已在 Liveweave 上测试,没有显示错误。但它仍然不起作用。有什么想法吗?

JAVACSCRIPT

calculate = function(){
var total1= (document.form[0].mark1.value) +(document.form[0].mark2.value) + (document.form[0].mark3.value);
  document.form[0].total.value = total1;
  return total1;
};

HTML

<form>
  <table>




    <tr>
      <th>Name</th>
      <th>Date</th>
      <th>Date</th>
      <th>Date</th>
      <th>Date</th>
      <th>Date</th>
      <th>Final</th>
    </tr>
    <tr>
      <td>Name1</td>
      <td class="mark1">34</td>
      <td class="mark2">77</td>
      <td class="mark3">99</td>
      <td>0</td>
      <td>0</td>
      <td class="total" placeholder="0">0</td>
    </tr>
  </table><br/>
<input type="button" value="Calculate" onclick="calculate"/>
<!-- End your code here -->
  </form>

任何帮助将不胜感激。干杯, 彼得

最佳答案

唯一具有 value 的 DOM 元素属性是表单字段( <input><textarea><select> )。您的示例中没有任何内容,因此您不能使用 value来获取它们。

同样,您无法使用 container.theClass 访问具有类名的元素。 ,所以document.form[0].mark1不会给你<td class="mark1">...</td>表单中表格中的单元格。

要访问元素,主要工具是:

要获取非表单单元格内的文本(非值),您可以使用 innerHTML (它为您提供 HTML 标记,但在您的情况下,这只是数字的文本)。然后我们解析该文本以获取数字。

在您的示例中,我们可以使用 document.querySelector(".mark1") 找到我们关心的元素和类似的。

function calculate(){
    var mark1 = document.querySelector(".mark1");
    var mark2 = document.querySelector(".mark2");
    var mark3 = document.querySelector(".mark3");
    var total = document.querySelector(".total");
    var sum   = parseInt(mark1.innerHTML, 10) +
                parseInt(mark2.innerHTML, 10) +
                parseInt(mark3.innerHTML, 10);
    total.innerHTML = String(sum);
}

请注意,这假设您只想使用第一个(唯一的)单元格。如果您有多个表单/表格并希望在每个表单/表格中工作,您可能会希望采取稍微不同的方式,也许可以通过将表单元素传递到函数中来实现:

function calculate(form){
    var mark1 = form.querySelector(".mark1");
    var mark2 = form.querySelector(".mark2");
    var mark3 = form.querySelector(".mark3");
    var total = form.querySelector(".total");
    var sum   = parseInt(mark1.innerHTML, 10) +
                parseInt(mark2.innerHTML, 10) +
                parseInt(mark3.innerHTML, 10);
    total.innerHTML = String(sum);
}

注意我如何使用form.querySelector而不是document.querySelector 。这会找到第一个匹配元素,但仅在表单内查找。因此,如果我们有三种形式,我们可以这样做:

var forms = document.querySelectorAll("form"); // Note the "All"
var index;
for (index = 0; index < forms.length; ++index) {
    calculate(forms[index]);
}

Live copy with three forms (来源位于答案末尾)

这就是使用类而不是 id 的原因s。 id s 对于页面上唯一的内容很有用,但通常更喜欢使用类来提高灵 active 。

<小时/>

旁白:请注意我如何更改函数的创建方式。以上是声明函数的正常方法。您正在做的是另一种方法,它使用表达式创建函数并将其分配给变量。但您没有声明该变量,因此您的代码成为 The Horror of Implicit Globals 的牺牲品。如果您更喜欢使用表达式,请声明变量:

var calculate = function(){
    var mark1 = document.querySelector(".mark1");
    var mark2 = document.querySelector(".mark2");
    var mark3 = document.querySelector(".mark3");
    var total = document.querySelector(".total");
    var sum   = parseInt(mark1.innerHTML, 10) +
                 parseInt(mark2.innerHTML, 10) +
                 parseInt(mark3.innerHTML, 10);
    total.innerHTML = String(sum);
};
<小时/>

三种表单示例的来源:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Example</title>
</head>
<body>
  <p>First form</p>
  <form>
    <table>
      <tr>
        <th>Name</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Final</th>
      </tr>
      <tr>
        <td>Name1</td>
        <td class="mark1">34</td>
        <td class="mark2">77</td>
        <td class="mark3">99</td>
        <td>0</td>
        <td>0</td>
        <td class="total">0</td>
      </tr>
    </table>
  </form>  
  <p>Second form</p>
  <form>
    <table>
      <tr>
        <th>Name</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Final</th>
      </tr>
      <tr>
        <td>Name1</td>
        <td class="mark1">4</td>
        <td class="mark2">7</td>
        <td class="mark3">18</td>
        <td>0</td>
        <td>0</td>
        <td class="total">0</td>
      </tr>
    </table>
  </form>  
  <p>Third form</p>
  <form>
    <table>
      <tr>
        <th>Name</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Date</th>
        <th>Final</th>
      </tr>
      <tr>
        <td>Name1</td>
        <td class="mark1">1</td>
        <td class="mark2">2</td>
        <td class="mark3">3</td>
        <td>0</td>
        <td>0</td>
        <td class="total">0</td>
      </tr>
    </table>
  </form>  
  <div><input type="button" value="Calculate" onclick="calculate"></div>
<script>
  function calculate(form){
    var mark1 = form.querySelector(".mark1");
    var mark2 = form.querySelector(".mark2");
    var mark3 = form.querySelector(".mark3");
    var total = form.querySelector(".total");
    var sum   = parseInt(mark1.innerHTML, 10) +
                parseInt(mark2.innerHTML, 10) +
                parseInt(mark3.innerHTML, 10);
    total.innerHTML = String(sum);
  }

  var forms = document.querySelectorAll("form"); // Note the "All"
  var index;
  for (index = 0; index < forms.length; ++index) {
    calculate(forms[index]);
  }
</script>
</body>
</html>

关于javascript - 第三次是一个魅力......也许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24841600/

相关文章:

javascript - 如何使用 JQuery 通过单击事件获取 <div> <p> 下拉列表中的选定值?

javascript - 什么是 jsconfig.json?

javascript - 从组件数组中删除组件

javascript - 使用 fork() 克服 node.js 内存限制?

javascript - 原型(prototype)链中的函数解析如何将 Object.prototype 作为构造函数

javascript - 保持上一页的类别

javascript - 带有两个附加字段的简单 BMI 计算

javascript - 为什么没有lottie规范?

javascript - 如何单击一个 div 并让它更改其他 div 的尺寸,然后再次单击后更改回来

Javascript getElementsByTagName 不返回结果