【问题标题】:Active menu item based on URL and ID基于 URL 和 ID 的活动菜单项
【发布时间】:2022-01-18 01:59:14
【问题描述】:

我希望在我的导航中基于 URL 和 ID 有活动的菜单项,不是 href。没有可用的解决方案(this onethis onethis one)对我有用。

我的导航是这样的

<nav id="PageNavigation">
    <div class="nav_ebene_2">
        <div role="button" class="nav-item" id="P_Bogendaten.aspx?IDNavi=194">
            <p>menu item 1</p>
        </div>
    </div>
</nav>

如果单击 menu item 1,则 URL 为 https://example.de/App_AspxFiles/P_Bogendaten.aspx?IDNavi=194。我想将menuactive 类添加到父元素(包含nav_ebene_2 的div)

我需要将id 与当前网址进行比较,如果匹配,请添加menuactive。这将是我的方式,但 if 条件永远不会为真。

  var currenturl  = window.location.href
  for (const div of document.querySelectorAll("#PageNavigation nav-item")) {
    if (div.id == currenturl ) {
      div.parentElement.classList.add("activemenu");
    }
  }

非常感谢!

【问题讨论】:

  • 尽量避免parentElement,有一天你可能想稍微改变一下你的HTML,JS会失败。使用more flexible .closest()

标签: javascript html jquery css navigation


【解决方案1】:

如果您从 window.location 读取 URI

const params = new URLSearchParams(window.location.search);
const id = params.get("IDNavi");

console.log(id) // "194"

或...如果您已经有一个 URI 地址为 String

const uriString = "https://example.de/App_AspxFiles/P_Bogendaten.aspx?IDNavi=194";
const id = new URL(uriString).searchParams.get("IDNavi");

console.log(id); // "194"

现在您提取了所需的 ID,只需定位所需的元素,例如:

const EL_id = document.querySelector(`[id$="IDNavi=${id}"]`);

属性选择器[] 在DOM 中查询idIDNavi=194 中以$= 结尾的元素

然后,要获取其父级,请使用 Element 的 .closest() 方法:

const EL_id_parent = EL_id.closest(".nav_ebene_2");

最后你可以添加所需的active

EL_id_parent.classList.add("activemenu");

演示时间:
使类 active 成为 ID 以特定查询参数值结尾的元素:

const uriString = "https://example.de/App_AspxFiles/P_Bogendaten.aspx?IDNavi=194";
const id = new URL(uriString).searchParams.get("IDNavi");

/*
// you should use this instead, the above is for this DEMO only 
const params = new URLSearchParams(window.location.search);
const id = params.get("IDNavi");
*/

const EL_id = document.querySelector(`[id$="IDNavi=${id}"]`);
const EL_id_parent = EL_id.closest(".nav_ebene_2");
EL_id_parent.classList.add("activemenu");
.activemenu {
  background: gold;
}
<nav id="PageNavigation">
  <div class="nav_ebene_2">
    <div role="button" class="nav-item" id="P_Bogendaten.aspx?IDNavi=194">
      <p>IDNavi=194</p>
    </div>
  </div>
  <div class="nav_ebene_2">
    <div role="button" class="nav-item" id="P_Bogendaten.aspx?IDNavi=195">
      <p>IDNavi=195</p>
    </div>
  </div>
</nav>

【讨论】:

  • 成功了!谢谢!
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多