Javascript onclick 事件在 Angular 中不同步
Javascript onclick event out of phase in Angular
使用 Angular 框架构建我网站的前端,我试图包含一个 button/icon 能够打开和关闭此 sidenav:
<nav id="left-sidenav" class="sidenav">
<div class="local_nav">
<a class="link" href="#">About</a>
<a class="link" href="#">Services</a>
<a class="link" href="#">Clients</a>
<a class="link" href="#">Contact</a>
</div>
</nav>
我在 codepen.io 上发现了一个很酷的 hamburger fold-out menu,我最终以这种方式对 HTML 代码进行了建模。
<div id="menuToggle">
<input type="checkbox" onclick="toggleNav()" />
<span></span>
<span></span>
<span></span>
<ul id="menu"></ul>
</div>
这是 toggleNav() 函数(添加到 index.html head):
<script>
//sidenav-width: 150px (this is defined in sidenav.component.scss)
function toggleNav() {
var x = document.getElementById("left-sidenav");
if (x.style.width === "0px") {
//openNav
x.style.width = "150px";
} else {
//closeNav
x.style.width = "0px";
}
}
</script>
所以当页面加载时,它看起来像这样 [请不要介意图片,这是我第一次使用 Angular,我正在努力变得更好 :) ]:
Reloaded page
现在,出于某种原因,当尝试使用这个汉堡菜单时,第一次点击不会触发 onclick 事件,图标最终会变成(它应该做的)十字形(见 codepen.io CSS)。
Page after the first click
虽然在第二次点击时,事件似乎开始起作用,sidenav 终于出现了,十字又恢复为汉堡图标。如果我一直点击汉堡,它就会正常工作,图标会不同步。
Page after the second click;
Page after the third click
这对我来说毫无意义,我最初想在 sidenav 显示 时获得十字,而不是在它隐藏时。
有谁知道如何真正解决这个问题?
您可以为此更改函数 toggleNav()
的实现:
在你的 .ts 文件中添加这个。
toggle: boolean = false;
toggleNav() {
this.toggle = !this.toggle;
window.scrollTo(0, 0);
}
我已经为此苦苦挣扎了 6 天,但我终于通过这样更改 JS 代码解决了这个问题:
<script>
//sidenav-width: 150px
var open = false;
function toggleNav() {
let x = document.getElementById("left-sidenav");
if (open == false) {
//openNav
x.style.width = "150px";
}
if (open == true) {
//closeNav
x.style.width = "0px";
}
open = !open;
}
</script>
这不是 Angular 中处理此问题的最正确方法,但它确实有效。
如果您觉得这有帮助,或者是否有更合适的方法来解决这个问题,请告诉我。
使用 Angular 框架构建我网站的前端,我试图包含一个 button/icon 能够打开和关闭此 sidenav:
<nav id="left-sidenav" class="sidenav">
<div class="local_nav">
<a class="link" href="#">About</a>
<a class="link" href="#">Services</a>
<a class="link" href="#">Clients</a>
<a class="link" href="#">Contact</a>
</div>
</nav>
我在 codepen.io 上发现了一个很酷的 hamburger fold-out menu,我最终以这种方式对 HTML 代码进行了建模。
<div id="menuToggle">
<input type="checkbox" onclick="toggleNav()" />
<span></span>
<span></span>
<span></span>
<ul id="menu"></ul>
</div>
这是 toggleNav() 函数(添加到 index.html head):
<script>
//sidenav-width: 150px (this is defined in sidenav.component.scss)
function toggleNav() {
var x = document.getElementById("left-sidenav");
if (x.style.width === "0px") {
//openNav
x.style.width = "150px";
} else {
//closeNav
x.style.width = "0px";
}
}
</script>
所以当页面加载时,它看起来像这样 [请不要介意图片,这是我第一次使用 Angular,我正在努力变得更好 :) ]: Reloaded page
现在,出于某种原因,当尝试使用这个汉堡菜单时,第一次点击不会触发 onclick 事件,图标最终会变成(它应该做的)十字形(见 codepen.io CSS)。 Page after the first click
虽然在第二次点击时,事件似乎开始起作用,sidenav 终于出现了,十字又恢复为汉堡图标。如果我一直点击汉堡,它就会正常工作,图标会不同步。 Page after the second click; Page after the third click
这对我来说毫无意义,我最初想在 sidenav 显示 时获得十字,而不是在它隐藏时。 有谁知道如何真正解决这个问题?
您可以为此更改函数 toggleNav()
的实现:
在你的 .ts 文件中添加这个。
toggle: boolean = false;
toggleNav() {
this.toggle = !this.toggle;
window.scrollTo(0, 0);
}
我已经为此苦苦挣扎了 6 天,但我终于通过这样更改 JS 代码解决了这个问题:
<script>
//sidenav-width: 150px
var open = false;
function toggleNav() {
let x = document.getElementById("left-sidenav");
if (open == false) {
//openNav
x.style.width = "150px";
}
if (open == true) {
//closeNav
x.style.width = "0px";
}
open = !open;
}
</script>
这不是 Angular 中处理此问题的最正确方法,但它确实有效。 如果您觉得这有帮助,或者是否有更合适的方法来解决这个问题,请告诉我。