You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript创建动态菜单时href属性返回undefined导致链接失效的问题求助

解决菜单锚点链接返回undefined的问题

嘿,别担心,这个问题其实很容易搞定!你遇到的href_el返回undefined的核心原因是:<h2>元素本身并没有href属性——这个属性是专门给<a>标签用的。你想要实现的应该是点击菜单链接跳转到页面对应标题的锚点功能,对吧?

问题出在哪?

你代码里的这一行:

var href_el = document.querySelectorAll("h2")[index].href;

因为<h2>不是链接元素,它天生就没有href属性,所以这行代码自然会得到undefined,导致菜单里的链接根本没法跳转。

解决方案:实现锚点跳转

要实现点击菜单跳转到对应标题,我们需要给每个<h2>设置唯一的id,然后让菜单里的<a>标签的href指向这个id(格式是#id名称)。

修改后的完整JavaScript代码:

var allH2 = Array.from(document.querySelectorAll("h2"));
var article = document.querySelector("article");
document.body.onload = addMenu;

function addMenu () {
    var menu = document.createElement("div");
    menu.setAttribute("class", "menu");
    
    var menu_title = document.createElement("h2");
    var title = document.createTextNode("Menu");
    menu_title.appendChild(title);
    menu.appendChild(menu_title);
    
    var list = document.createElement("ul");
    list.setAttribute("class", "list");
    menu.appendChild(list);
    
    allH2.forEach(function callback(element, index) {
        // 1. 给每个h2设置唯一的id(这里用索引+1生成,简单直接)
        var sectionId = "section-" + (index + 1);
        element.id = sectionId;
        
        var link = document.createElement("a");
        var content = document.createTextNode(element.textContent);
        var list_element = document.createElement("li");
        
        // 2. 设置a标签的href为锚点,指向对应的h2 id
        link.setAttribute("href", "#" + sectionId);
        
        list_element.setAttribute("class", "list-element");
        link.appendChild(content);
        list_element.appendChild(link);
        list.appendChild(list_element);
    });
    
    document.body.insertBefore(menu, article);
}

额外优化小技巧

如果你想让id更语义化(比如用标题文本生成),可以把设置id的代码改成这样:

// 把标题文本转成小写,空格替换成连字符,生成更友好的id
var sectionId = element.textContent.toLowerCase().replace(/\s+/g, "-");
element.id = sectionId;

这样Title 1对应的id就是title-1,既易读又规范。

另一种可选方式:手动在HTML里设置id

如果你更习惯在HTML里直接给<h2>加id,比如:

<article class="article">
<h2 id="title-1">Title 1</h2>
<h2 id="title-2">Title 2</h2>
<h2 id="title-3">Title 3</h2>
</article>

那JS里就可以直接取element.id来设置锚点:

link.setAttribute("href", "#" + element.id);

这样修改后,你的菜单链接就能正常跳转到对应的标题位置啦!

内容的提问来源于stack exchange,提问作者Oydrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:37:28