javascript - 我应该如何在这里使用 querySelector?
问题描述
我正在尝试使用 vanilla JavaScript 为没有框架的客户端创建前端 SPA 路由。最终,我想单击列表元素中的链接,更新 iframe,并更新任务栏 URL。.querySelector()
但是,在我可以可靠地使用之前,我不能做任何事情。下面是一个包含 HTML(原样)和 JS(……不是)的片段。
document.addEventListener(
"DOMContentLoaded",
() => {
/**
* DOM object declarations
*/
// ID-labeled content
const $nav = document.getElementById("nav");
// Tabs
let tabs = {};
for (let tab in ["home", "about", "songs", "rates", "contact"]) {
tabs[tab] = $nav.querySelector(tab);
}
/**
* Routing logic
*
* Creates an event listener for each tab, which updates the iframe
* content and the URL.
*/
const routerCallback = (key) => {
console.log(key);
};
for (let key in tabs) {
const $tab = tabs[key];
$tab.addEventListener("click", () => routerCallback(key));
}
},
false
);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
<title>Karaoke</title>
<script src=/static/js/routing.js></script>
</head>
<body>
<nav id="nav">
<ul>
<a class="home" href="javascript:void(0);">
<li>Home</li>
</a>
<a class="about" href="javascript:void(0);">
<li>About</li>
</a>
<a class="songs" href="javascript:void(0);">
<li>Songs</li>
</a>
<a class="rates" href="javascript:void(0);">
<li>Rates</li>
</a>
<a class="contact" href="javascript:void(0);">
<li>Contact</li>
</a>
</ul>
</nav>
<iframe
id="content"
width="800"
height="600"
src="/iframe/home"
></iframe>
</body>
</html>
这会导致控制台错误。当我逐步使用调试器时,我注意到$nav
变量首先被填充,但随后被设置为null
. tabs
取决于此,因此它null
也会填充值。如何正确设置这些值?
解决方案
- 使用
for...of
而不是for...in
迭代数组的元素。 - 在类名之前使用
.
以选择具有指定类的元素。
let tabs = {};
for (let tab of ["home", "about", "songs", "rates", "contact"]) {
tabs[tab] = $nav.querySelector('.' + tab);
}
推荐阅读
- ios - 使用 NotificationCenter 通知 Collection View Cell 以更改其子视图 - swift
- math - word2vec算法中2个超点之间的最大欧几里得距离是多少?
- wix - WiX 将 ExePackage 添加到产品以安装 vcredist
- asp.net - VB ASP动态按钮单击事件未命中处理程序事件
- powershell - 使用 powershell -comobject outlook.application add CC 生成电子邮件
- mysql - 为什么 Inner-join 在 where cluase 中显示错误的数据?
- c# - C# Unity - 如何在游戏中单击空格键时启用“PlayerMovement”脚本和“使用重力”复选框(刚体)?
- cesium - Cesium 3DEarth:让地球自转
- vuetify.js - vuetify中的`select`和`combobox`有什么区别
- google-cloud-sql - 将 Google AppMaker 链接到 CloudSQL