【问题标题】:Creating a dynamic entry list (Javascript)创建动态条目列表 (Javascript)
【发布时间】:2019-07-14 13:31:46
【问题描述】:

所以基本上我正在尝试创建一个有序列表来跟踪输入到文本框中的数字并显示相关数组中所有数字的总和。不幸的是,我现在无法访问代码,因为它在另一台计算机上,但我可以提供 pusdo-code。这就是我想要做的。

  1. 用户在input 元素中输入数字value 并按下回车键button

  2. 输入 button 获取此 value 并将其添加到 array 并将此值添加到 ordered list 以显示为输入值的列表。

  3. <h3> 元素中显示数组的总和/累加值。

  4. 能够删除动态创建的li元素onclick

  5. 在删除或添加元素时更新并显示数组和<h3>

如果有更好的方法来执行此操作,请删除代码。我不是 JS 方面的专家,所以请随意深入解释。

【问题讨论】:

  • 不要一次添加到数组中,一次添加到 DOM 中。只需有一个函数在 dom 中呈现数组和总和,并在向数组添加/删除值时调用它。
  • "很遗憾,我现在无法访问代码,因为它在另一台计算机上..." 我建议现在删除这个问题,然后编辑,一旦您可以访问minimal reproducible example 代码,就更新并重新打开它。因为这个问题太开放了,而且是一个基于意见的思想实验。
  • 用户通过输入一个数字并按下回车键来填充数组。你能举个例子吗?
  • @DavidThomas 计算机正在工作。我无法从我的工作计算机导出文件,我只能在那里管理它们,这就是为什么我无法提供代码,除非我只是创建另一个示例。

标签: javascript html arrays internet-explorer ecmascript-5


【解决方案1】:

假设您有一个数字数组。

var numbers = [];

在每次点击按钮时,您都会像这样从输入中获得价值。

var value = document.getElementByTagName('input').value;

然后将此值推送到数组 numbers。

numbers.push(value);

显示 li 内的所有项目:

numbers.forEach(function(element) {
  var node = document.createElement("LI");
  var textnode = document.createTextNode(element);
  node.appendChild(textnode);
  node.onclick =  removeItem(index) {
   numbers.splice(index, 1);
  };
  document.getElementTagName("ul").appendChild(node);
});

然后在 h3 中显示这个数组的总和。

document.getElementByTagName("h3").innerHTML = numbers.reduce(myFunc);
function myFunc(total, num) {
  return total - num;
}

【讨论】:

  • 这是一个很好的答案。可悲的是我使用的是不支持 => 操作数的旧版本 IE
  • @CouchMango 我编辑了答案,现在您对支持 es6 的浏览器没有任何问题。
  • 不错的答案,但是,问题要求有序列表,这似乎是指一个 ol 标签。
  • 我最终遗憾地放弃了。当我对这个主题有更多的了解时,我可能会在以后再试一次。
【解决方案2】:

您需要一个函数来刷新值,在添加元素和删除元素时都会调用该函数。您的数组可以在所有这些情况下重新定义,如下所示:

<input type="text" id="input">
<input type="submit" value="Submit" onclick="enter(parseInt(document.getElementById('input').value))">
<ol id="list">
</ol>
<h3 id="output">

</h3>
<h3 id="sum">

</h3>
<script type="text/javascript">
var values = [];
var list = document.getElementById("list");
var output = document.getElementById("output");
var sum = document.getElementById("sum");

function refreshValues() {
    values = [];
    var lis = list.querySelectorAll("li");
    for (var li of lis) values.push(parseInt(li.innerText));
    output.innerText = "Output: " + values.join(",");
    var sumVal = 0;
    for (var val of values) sumVal += val;
    sum.innerText = "Sum: " + sumVal;
}

function enter(value) {
    var liItems = list.querySelectorAll("li");
    var text = "";
    for (var li of liItems) {
        var currentValue = parseInt(li.innerText);
        if (value < currentValue) {
            text += '<li onclick="remove(this);">' + value + "</li>";
            value = undefined;
        }
        text += li.outerHTML;
    }
    if (value !== undefined) {
        text += '<li onclick="remove(this);">' + value + '</li>';
    }
    list.innerHTML = text;
    refreshValues();
}

function remove(what) {
    what.remove();
    refreshValues();
}
</script>

Fiddle

编辑

为了兼容旧浏览器,我们需要去掉 for..of 循环:

<input type="text" id="input">
<input type="submit" value="Submit" onclick="enter(parseInt(document.getElementById('input').value))">
<ol id="list">
</ol>
<h3 id="output">

</h3>
<h3 id="sum">

</h3>
<script type="text/javascript">
var values = [];
var list = document.getElementById("list");
var output = document.getElementById("output");
var sum = document.getElementById("sum");

function refreshValues() {
    values = [];
    var lis = list.querySelectorAll("li");
    for (var liIndex = 0; liIndex < lis.length; liIndex++) {
        values.push(parseInt(lis[liIndex].innerText));
    } 
    output.innerText = "Output: " + values.join(",");
    var sumVal = 0;
    for (var valIndex = 0; valIndex < values.length; valIndex++) sumVal += values[valIndex];
    sum.innerText = "Sum: " + sumVal;
}

function enter(value) {
    var liItems = list.querySelectorAll("li");
    var text = "";
    for (var liIndex = 0; liIndex < liItems.length; liIndex++) {
        var currentValue = parseInt(liItems[liIndex].innerText);
        if (value < currentValue) {
            text += '<li onclick="remove(this);">' + value + "</li>";
            value = undefined;
        }
        text += liItems[liIndex].outerHTML;
    }
    if (value !== undefined) {
        text += '<li onclick="remove(this);">' + value + '</li>';
    }
    list.innerHTML = text;
    refreshValues();
}

function remove(what) {
    what.remove();
    refreshValues();
}
</script>

Fiddle

【讨论】:

  • 这基本上就是我一直要求的!这适用于旧版本的 IE 吗?
  • @CouchMango 它应该可以工作。请测试它,如果它在您的 IE 浏览器中有效,则接受此答案作为正确答案。如果您在这些旧浏览器中可能遇到一些问题/错误,请告诉我。我尽量避免使用 ES6 特性。
  • 我会测试并告诉你!
  • 运行代码时出错。 “预期的 ';'”。它发生在 for 循环内的 refreshValues() 函数中,for(var li (Error is here) of lis) {...} ; (函数的第 3 行)
  • @CouchMango 好点,抱歉。我最初使用 for..of 循环,这是 ES6 的一个特性。现在我已经摆脱了它。我已经编辑了我的答案。你能测试第二个脚本吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2012-09-05
  • 2023-03-26
相关资源
最近更新 更多