【问题标题】:Append a List Using Javascript使用 Javascript 附加列表
【发布时间】:2011-06-09 12:07:50
【问题描述】:

我正在开发一个新项目,它使用大量 ul(无序列表) 元素,其中一些列表共享相同的值,所以我想创建一个 Javascript 函数,通过传递 @987654322 来自动化流程@ 用于函数并返回页面的 HTML。像这样的:

<h1>Test Page</h1>
List fruits:
<script type="text/javascript" charset="utf-8">
    var fruits = ["Banana", "Apple", "Pear", "Strawberry", "Lemon"];
    do_list(fruits);
</script>

应该会生成:

<h1>Test Page</h1>
List fruits:
<ul>
    <li>Banana</li>
    <li>Apple</li>
    <li>Pear</li>
    <li>Strawberry</li>
    <li>Lemon</li>
</ul>

这个怎么做?

【问题讨论】:

    标签: javascript html arrays


    【解决方案1】:

    给定一个值列表以及您要附加的节点,这将为该列表中的每个项目创建li 标签。

    function do_list(arr, ulNode)
    {
        for(var i = 0; i < arr.length; i++)
        {
            var node = document.createNode("li");
            node.nodeValue = arr[i];
            ulNode.appendNodes(node);
        }
    }
    

    这是一个更好的版本,它允许您创建任意节点类型 - 您可以将 td 作为 tagNametr 作为 parentNode 传递,它会填充该表行。

    function do_list(arr, parentNode, tagName)
    {
        if(!tagName)tagName="li";
        for(var i = 0; i < arr.length; i++)
        {
            var node = document.createNode(tagName);
            node.nodeValue = arr[i];
            parentNode.appendNodes(node);
        }
    }
    

    使用示例:

    <h1>Test Page</h1>
    List fruits:
    <ul id="list">
        <li>Banana</li>
        <li>Apple</li>
        <li>Pear</li>
        <li>Strawberry</li>
        <li>Lemon</li>
    </ul>
    <script type="text/javascript">
        do_list(["Banana", "Apple", "Pear", "Strawberry", "Lemon"], 
                document.getElementById("list"))
    </script>
    

    【讨论】:

    • @Hippo 虽然 jQuery 很棒,但当手术刀更好时,它通常是一把大锤。
    • 请使用.nodeValue而不是.innerHTML来分配文本内容
    • 代码不起作用,即使使用您的示例也不会生成列表... :(
    • @NathanCampos 在哪个浏览器上?
    【解决方案2】:

    这样的?

    <script type="text/javascript">
      function do_list(arr) {
        var out = '<ul>';
        for (var k=0; k < arr.length; k++) {
          out += '<li>' + arr[k] + '</li>';
        }
        out += '</ul>';
        return out;
      }
      var fruits = ["Banana", "Apple", "Pear", "Strawberry", "Lemon"];
      document.write(do_list(fruits));
    </script>
    

    【讨论】:

    • 请不要使用document.write。尤其是因为您甚至不打扰.open.close 文档。
    • 使用document.write时不需要调用document.open。如果文档已关闭,调用 document.write 将调用 document.open。如果文档没有关闭,你不想调用 document.open
    【解决方案3】:

    试试:

    '<ul><li>' + fruitsArray.join('<li>') + '</ul>';
    

    或作为一个函数:

    function arrayToList(array) {
      return '<ul><li>' + array.join('<li>') + '</ul>';
    }
    

    或者如果您真的想要封闭的 LI 标记(在任何浏览器中都是可选的且不是必需的):

    function arrayToList(array) {
      return '<ul><li>' + array.join('</li><li>') + '</li></ul>';
    }
    

    如果你想在某个元素中使用它:

    function arrayToContainedList(container, array) {
      container.innerHTML = '<ul><li>' + array.join('</li><li>') + '</li></ul>';
    }
    

    等等。我认为方法很明确。

    【讨论】:

    • 每个
    • 都缺少结束标签
  • 这将产生一个未封闭的李的列表,即(
  • banana
  • orange
  • pear
  • LI 元素的结束标签是可选的。但不要让这妨碍投票。 :-)
  • " 如果你真的想关闭" 它们不是可选的。浏览器解析垃圾 HT​​ML,因为这就是他们赚钱的方式。请编写有效且语义化的 HTML。或者至少参考 W3C 规范说
  • 在 HTML4、HTML5 和 XHTML 中是可选的
  • Raynos - LI elements 的结束标签 总是 是可选的,HTML5 不会改变这一点。 HTML 4.01 规范(已有 11 年历史的规范)中的示例没有结束标记。 XHTML 无关紧要,实际上没有人在网络上提供它。绝大多数带有 XHTML DOCTYPE 的页面都以 HTML 形式提供(使 DOCTYPE 无关紧要)并且无论如何都不是有效的 XHTML。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签