【问题标题】:JavaScript get h1 elements in HTML document and update unique IDsJavaScript 获取 HTML 文档中的 h1 元素并更新唯一 ID
【发布时间】:2013-05-11 14:18:50
【问题描述】:

我有一个旧版 html 文档,其中包含没有 id 的 h1 元素。 我想要实现的是能够使用 JavaScript 获取所有 h1(s),然后为每个添加一个唯一 ID。

我已搜索但找不到有效的解决方案。

【问题讨论】:

  • 您希望 ID 采用什么格式?你能提供一些示例 HTML 吗?
  • 您可以在没有 ID 的情况下访问任何 DOM 元素。为什么需要这样做?
  • 为什么?我可以想到您可能想要的几个原因,但可能有用的原因会在“独特”之外施加额外的要求。你想解决什么问题?如果我们知道这一点,我们就可以解决问题,而不是您认为的解决方案。

标签: javascript random


【解决方案1】:

尝试使用document.getElementsByTagName("h1") 获取所有这些。遍历它们,检查它们是否有id,然后正常工作。试试:

var h1s = document.getElementsByTagName("h1");
for (var i = 0; i < h1s.length; i++) {
    var h1 = h1s[i];
    if (!h1.id) {
        h1.id = "h1" + i + (new Date().getTime());
    }
}

演示: http://jsfiddle.net/kTvA2/

运行演示后,如果您检查 DOM,您会发现 4 个 h1 元素中有 3 个具有一个新的、唯一的 id。首先带有id 的那个没有改变。

请注意,此代码需要在所有元素都准备好/渲染后运行,这可以通过将代码放入 window.onload 处理程序中来实现。提供的演示设置为隐式运行代码。


更新:

使用 jQuery,您可以使用:

$(document).ready(function () {
    $("h1:not([id])").attr("id", function (i, attr) {
        return "h1" + i + (new Date().getTime());
    });
});

演示: http://jsfiddle.net/kTvA2/7/

【讨论】:

  • 公平的解决方案,但为什么一开始就想这样做呢?
  • @Pekka웃 谁知道呢。哈哈他们说I have a legacy html document,所以我不知道他们为什么不只是改变HTML
  • 感谢您的快速回复和 cmets,我真正需要做的就是使用所有 h1 标签的标题生成一个目录。仅当我的 h1 标签具有唯一 ID 时,我用于 TOC 生成的脚本才有效。
  • @ManUO 你有什么理由找不到/替换实际的 HTML 吗?无论如何,您需要做什么?为它们设置id 是微不足道的——以后你将在这些元素上使用id 做什么?
  • 我可以使用正则表达式,但我不知道该怎么做,因为一旦找到所有 h1 标签,我就无法将随机数添加到匹配的术语中。
【解决方案2】:

使用querySelectorAll() 获取所有标题元素,然后遍历结果并为每个元素生成唯一的 id。

var headerElements = document.querySelectorAll('h1');
for(h in headerElements) {
    if(headerElements[h] instanceof Element) {
        headerElements[h].id=uniqueIDgenerator();
    }
}

【讨论】:

  • 我刚刚在 Mac 上的 Firefox 中尝试了上述方法,但没有成功。我只是先在我的 html head 部分中使用了上面的代码,然后在 body 元素中没有成功。我做错了吗?
  • 当您可以使用普通的for 循环遍历索引时,为什么还要使用for in 循环并且必须检查instanceof Element
  • @Ian 这是我知道如何在没有 jQuery 的情况下做到这一点的方式。欢迎您发布替代回复。我想看看更简单的方法。 @ManUO我不确定为什么它不适合你。在发布之前,我在 FF 中对其进行了测试。请注意,您必须将占位符函数 uniqueIDgenerator() 替换为您打算用来生成唯一 ID 的任何内容。
  • @ogc-nick 我的意思是,你可以使用for (var i = 0; i &lt; headerElements; i++) { headerElements[i].id = uniqueIDgenerator(); },而不是for in 循环。您不应该使用 for in 循环遍历数组中的元素 - 它用于循环遍历对象中的键
  • @ogc-nick 没问题 :) 如果您愿意,可以阅读以下参考资料 - stackoverflow.com/questions/500504/…
猜你喜欢
  • 2016-09-16
  • 2014-09-24
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2017-06-30
  • 2023-04-06
  • 2014-05-14
  • 2014-11-07
相关资源
最近更新 更多