【问题标题】:Make a html unordered list from javascript array从javascript数组制作一个html无序列表
【发布时间】:2017-01-10 13:54:38
【问题描述】:

我有点问题。我正在尝试从 javascript 数组创建一个无序列表,这是我的代码:

var names = [];
var nameList = "";

function submit()
{
var name = document.getElementById("enter");
var theName = name.value;
names.push(theName);
nameList += "<li>" + names + "</li>";
document.getElementById("name").innerHTML = nameList;
}


<input id="enter" type="text">
<input type="button" value="Enter name" onclick="submit()">
<br>
<br>
<div id="name"></div>

例如,如果我发布 2 个名字,Name1Name2,我的列表如下所示:

•Name1

•Name1,Name2

我希望它看起来像这样:

•Name1
•Name2

【问题讨论】:

  • 旁注:不要在内联事件处理程序中使用名称为“submit”的自定义函数。一旦您将元素放入表单中,submit 将引用&lt;form&gt; 元素的提交方法。此外,您的 div 元素应该是 ul 元素。

标签: javascript html dom


【解决方案1】:

如果您查看您的代码,您只会创建一个li,并将您的所有names 作为内容。您想要做的是循环您的names 并为每个li 创建一个单独的li,对吗?

变化:

nameList += "<li>" + names + "</li>";

到:

nameList = "";
for (var i = 0, name; name = names[i]; i++) {
  nameList += "<li>" + name + "</li>";
}

如果您对一些更好的做法感兴趣,可以在此处查看您的逻辑重写:http://jsfiddle.net/rgthree/ccyo77ep/

【讨论】:

  • 请注意,循环不能很好地处理“空”名称。但是这样的验证逻辑是由 OP 来实现的。
  • 如果我这样做,它看起来会好一些,但现在我仍然在另一个列表项中获得以前的结果,如果我现在输入 Name2 它不是第二个而是第三个列表项,Name1 是第一个和第二个列表项。
  • @marceljager 是的,你有 nameList 作为 submit 闭包之外的变量,所以它总是附加相同的项目。我已经更新了我的答案,以便在每次提交调用时,nameList 都会自行空白。那应该为你做:)
【解决方案2】:
function submit()
{
  var name = document.getElementById("enter");
  var theName = name.value;
  names.push(theName);
  document.getElementById("name").innerHTML = "";
  for (var I = 0; I < names.length; I++)
  {
       nameList = "<li>" + names[I] + "</li>";
       document.getElementById("name").innerHTML += nameList;
  }
}

您正在使用一个数组,当您打印一个数组时,JavaScript 将显示该数组的所有条目,以逗号分隔。您需要遍历数组以使其工作。但是,您可以对此进行优化:

var names = [];


function displayUserName()
{
  var theName = document.getElementById("enter").value;
  if (theName == "" || theName.length == 0)
  {
     return false; //stop the function since the value is empty.
  }
  names.push(theName);
  document.getElementById("name").children[0].innerHTML += "<li>"+names[names.length-1]+"</li>";
}
<input id="enter" type="text">
<input type="button" value="Enter name" onclick="displayUserName()">
<br>
<br>
<div id="name"><ul></ul></div>

在此示例中,通过使用添加了lis(列表项)的UL(或无序列表)容器,HTML 在语法上是正确的。

document.getElementById("name").children[0].innerHTML += "<li>"+names[names.length-1]+"</li>"; 

这一行选择名称为:name 的 div 及其第一个子项(ul)。然后它将LI 附加到列表中。

正如@FelixKling 所说:避免使用保留或模棱两可的名称。

【讨论】:

  • 没有解释已经很糟糕了,但是这个实际上产生了错误的结果。
  • 您可能应该解释一下您的代码解决了哪些问题,以及如何解决。代码本身很少用作教具(而回答问题确实构成了“教学”)。
  • @FelixKling 忽略了 +=,它现在已经消失了。
  • 谢谢!这对我有帮助,现在我可以用 css 让它变得漂亮。 :)
【解决方案3】:

<div>

    <label for="new-product">Add Product</label><br /><br /><input id="new-product" type="text"><br /><br /><button>Add</button>

</div>

<div>
  <ul id="products">
  </ul>
  <p id="count"></p>
</div>

  var products = [];
  var productInput = document.getElementById("new-product");

  var addButton = document.getElementsByTagName("button")[0];
  var productListHtml = "";
  var abc = 0;

  addButton.addEventListener("click", addProduct);

  function addProduct() {
      products.push(productInput.value);

      productList();


  }

  function productList() {                    
          productListHtml += "<li>" + products[abc]    + "</li>";
          document.getElementById("products").innerHTML = productListHtml;
          abc++;    
      }                

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 2021-08-16
    • 2015-01-13
    • 2017-05-12
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多