当有人第二次点击按钮时,有人能告诉我为什么下面的JavaScript代码会返回一个未定义的错误吗?
第一次单击时,它将显示h3元素中的文本,按钮的inner.text将更改。但是,当我再次单击它时,我得到未定义的错误。
我查看DOM,看到第一次单击后类名已更改为“显示”,并且确实如此。我假设在第二次单击时,当类名更改为“显示”时,条件语句将跳转到“else”部分并将类更改回“隐藏”并返回按钮文本以便再次隐藏h3文本。但是,我得到了“Uncaught TypeError:无法读取属性'className'的未定义”。
<body>
<header>
<h1>Header</h1>
<div id="button-div">
<button id="button">Click to Reveal</button>
</div>
<h3 class="hide">Text</h3>
<h2>subtext</h2>
</header>
</body>
CSS:
.hide {
display: none;
}
和JS:
var button = document.getElementById("button");
var textHide = document.getElementsByClassName("hide");
button.addEventListener("click", function() {
if (textHide[0].className === "hide") {
textHide[0].className = "reveal";
button.innertext = "Click to Hide";
} else {
textHide[0].className = "hide";
button.innertext = "Click to Reveal";
}
console.log("click");
});
答案 0 :(得分:0)
这是因为event.model.item
以 live 的方式工作。因此,当您将getElementsByClassName
从className
更改为hide
时,对象none
也会更新,然后不再有textHide
CSS的元素您网页中的课程。
您可以使用hide
:
querySelectorAll
答案 1 :(得分:0)
问题在于,当你隐藏元素时,你正在清空document.getElementsByClassName("hide")
,因为它是live NodeList - 即每次更新类名时它都会更新。通过重置类名,您将删除hide
类。
var button = document.getElementById("button");
var textHide = document.getElementsByClassName("toHide");
button.addEventListener("click", function() {
if (textHide[0].classList.contains('hide')) {
textHide[0].classList.remove("hide");
button.innertext = "Click to Hide";
} else {
textHide[0].classList.add("hide");
button.innertext = "Click to Reveal";
}
console.log("click");
});
将相应的HTML中的类更新为toHide hide
而不是hide
,以便您获得元素的引用并初始化隐藏。或者,您可以使用ID或不同的类名。
答案 2 :(得分:0)
您收到错误“Uncaught TypeError:无法读取未定义的属性'className',因为没有元素类名称'hide'on第二次点击。
var button = document.getElementById("button");
var textHide = document.getElementsByTagName("h3");
button.addEventListener("click", function() {
if (textHide[0].className == "hide") {
textHide[0].className = "reveal";
button.innertext = "Click to Hide";
} else {
textHide[0].className = "hide";
button.innertext = "Click to Reveal";
}
console.log("click");
});
<强>演示:强>