javascript - 使用 getElementsByClassName 而不是 getElementById 修改脚本以追加子项

标签 javascript

我正在使用下面的脚本来生成目录。

它当前将目录附加到 ID。我想使用 getElementsByClassName 在同一页面上添加两次目录。

我知道我需要循环遍历元素数组,但我就是无法获得正确的语法。

非常感谢任何帮助。

// External code for generating a simple dynamic Table of Contents
function generateTableOfContents(els) {
    var anchoredElText,
        anchoredElHref,
            ul = document.createElement('UL');

  document.getElementById('table-of-contents').appendChild(ul);

    for (var i = 0; i < els.length; i++) {
    anchoredElText = els[i].textContent;
        anchoredElHref = els[i].querySelector('.anchorjs-link').getAttribute('href');
    addNavItem(ul, anchoredElHref, anchoredElText);
  }
}

function addNavItem(ul, href, text) {
  var listItem = document.createElement('LI'),
          anchorItem = document.createElement('A'),
      textNode = document.createTextNode(text);

  anchorItem.href = href;
  ul.appendChild(listItem);
  listItem.appendChild(anchorItem);
  anchorItem.appendChild(textNode);
}

Example of getElementById

最佳答案

您将在那里遇到问题。单个元素只能附加到文档一次。如果您尝试将其附加到其他位置,它将首先从当前位置删除。

避免这种情况的一种可能的解决方案是使用 cloneNode .

使用 ES5 forEach ,您的函数的可能版本是:

function generateTableOfContents(els) {
    var anchoredElText, anchoredElHref,
        ul = document.createElement('UL');

    for (var i = 0; i < els.length; i++) {
        anchoredElText = els[i].textContent;
        anchoredElHref = els[i].querySelector('.anchorjs-link').getAttribute('href');
        addNavItem(ul, anchoredElHref, anchoredElText);
    }

    // We have to use call here, because getElementsByClassName returns an array-like, not an actual array
    [].forEach.call(document.getElementsByClassName('table-of-contents'), function(el) {
        el.appendChild(ul.cloneNode(true));
    });

    // Alternative to the 3 above lines using a for
    // var tocs = document.getElementsByClassName('table-of-contents');
    // for (var i = 0; i < tocs.length; i++) {
    //  tocs[i].appendChild(ul.cloneNode(true));
    // }
}

关于javascript - 使用 getElementsByClassName 而不是 getElementById 修改脚本以追加子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393412/

相关文章:

javascript onclick 事件未正确触发

javascript - 数据可视化的性能和开发可能性

javascript - Angular 圆菜单 CSS 和 jQuery

JavaScript 在 Qualtrics 中并不总是有效

javascript - Bootstrap : Fixed navigation does not works

javascript - 清理 HTML5 视频

javascript - 如何使用 Cmder 在 Windows 计算机上运行时 (process.env.SERVER) 运行 npm 变量?

javascript - 计算每行汇率变化的金额

javascript - 由于 JavaScript 不保证对象中的属性顺序,因此 JSON.stringify() 的实际行为如何?

javascript - 了解 Bootstrap 轮播代码