Ваша проблема - проверка перед применением стиля. При первом щелчке элемент устанавливается на display: none
, потому что при загрузке страницы элемент не имеет установленного свойства display
, поэтому, когда ваш код проверяет if (x.style.display == "none")
, он получает false
- поэтому он устанавливает его на display: none
, Использование свойства style
Node ссылается на фактическое свойство style
элемента HTML и включает , а не включает CSS свойства.
Я бы лично создал два класса , .hidden
и .visible
и используйте Node.classList.toggle
для переключения класса элемента, но ваш подход тоже работает.
Мы можем изменить ваш if / else
на switch/case
(или if / else if / else
) установить действие по умолчанию, если элемент не имеет установленного свойства style.display
- вместо того, чтобы скрывать его по умолчанию, как это происходит здесь, мы установим display: block
по умолчанию.
function toggleHide(test) {
var x = document.getElementById(test);
var newValue;
var visible = "block";
var hidden = "none";
switch(x.style.display) {
case hidden:
// show if hidden
newValue = visible;
break;
case visible:
// hide if visible
newValue = hidden;
break;
default:
// visible if style.display not set yet
newValue = visible;
break;
}
// clear out style.display
x.style.setProperty("display", "");
// set new value
x.style.setProperty("display", newValue);
}
// call toggleHide on header click
document.getElementById("header").addEventListener("click",
e => toggleHide("abc")
);
.dropdown {
display: none;
}
<h1 id="header">Click me</h1>
<p id="abc" class="dropdown">This is hidden by default</p>