В этом упражнении по написанию кода мне потребовалось некоторое время, чтобы выяснить, как ссылаться на класс, который здесь скрыт, и теперь, когда он работает, было бы стыдно нарушать его, однако я надеялся реорганизовать этот класс. Дело в том, что ссылка на класс, который необходимо скрыть, является более чистой.
Как вы можете видеть, удвоение nextElementSibling для обхода дерева обходится в жестком кодировании решения для каждого адаптивного повторного использования. Я надеялся просто изменить классы по запросу. Чтобы сделать это, сначала выглядело как использование this.querySelector ('* +') может быть ответом, но после многих попыток (возможно, не правильных, потому что он все еще может работать, если вы не скажете мне иначе), он потерпел неудачу ,
Работает следующее:
let el = this.parentNode.firstChild
el = el.nextElementSibling
el = el.nextElementSibling
Итак, как можно проще ссылаться на класс .acc-body, учитывая схему HTML, на которую он действует?
И, поскольку принятый здесь подход к передаче событий является явно нестандартным и, вероятно, не рекомендуется, является ли эта причина достаточной для того, чтобы избежать его использования в производстве?
<div class="acc">
<div class="acc-item">
<!-- <div class="acc-title"> -->
<h1 class="acc-title" id="btn_hide">Click to hide the Body</h1>
<!-- </div> -->
<div class="acc-body hideable">
<p id="head1">Why innerHTML is so great...</p>
</div>
</div>
<div class="acc-item">
<h1 class="acc-title" id="other_btn_hide_xxxx">Click to hide the Body</h1>
<div class="acc-body hideable">
<p id="head2">Why innerHTML is so great...</p>
</div>
</div>
</div>
Реализовано как IIFE; рекомендуем поместить его в собственный файл .js и ссылаться на него из тега скрипта в документе HTML.
(function() {
console.log('ready to assign event handler to chosen nodelist of elements')
// returned as a nodelist
all = document.querySelectorAll(".acc-item .acc-title")
console.log(all);
// document[selectionMethod(element)]
// element.selectionMethod.classList
console.log('setAttribute \'clickable\' received on: -----------');
all.forEach ( (j) => {
console.log(j);
// j.setAttribute('onclick', 'showhide(this)')
j.setAttribute('clickable', 'true')
j.classList.add("clickable")
})
console.log('listen for onclick on: ----------');
all.forEach( (j) => {
console.log(j);
j.onclick = function () {
// alert(this);
// let el = this.querySelector('* +')
let el = this.parentNode.firstChild
el = el.nextElementSibling
el = el.nextElementSibling
console.log(el);
if (el.hidden){
el.hidden = false
} else {
el.hidden = true
}
}
})
})()