У меня есть следующий яваскрипт метод, который пытается Переключите свернуть или развернуть на участке HTML:Javascript в Drupal: this.nextElementSibling возвращается в Drupal NULL, но работает в простом HTML файл
<script>
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].onclick = function() {
this.classList.toggle("active");
window.alert(this);
this.nextElementSibling.classList.toggle("show");
}
}
</script>
Когда я запустить то же точное содержимое HTML в статическом HTML-файле, свернуть, развернуть работает нормально. (Window.alert выше показывает [object HTMLButtonElement] как в Drupal, так и в статическом HTML). Но при использовании одного и того же кода HTML/JS/CSS, испеченного на моей странице Drupal, this.nextElementSibling возвращает NULL, поэтому toggle ("show") не может быть вызван.
Кто-нибудь знает, почему в Drupal этот метод woudl возвращает NULL, но все работает отлично в статическом HTML-файле.
Вот полное содержание всей статической HTML-скрипт (отлично работает):
<style>
button.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
button.accordion.active, button.accordion:hover {
background-color: #ddd;
}
div.panel {
padding: 0 18px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: 0.6s ease-in-out;
opacity: 0;
}
div.panel.show {
opacity: 1;
max-height: 500px;
}
</style>
<h2>Animated Accordion</h2>
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 3</button>
<div id="foo" class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<script>
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].onclick = function() {
this.classList.toggle("active");
window.alert(this);
this.nextElementSibling.classList.toggle("show");
}
}
</script>
UPDATE Проблема была из-за Drupal инъекционного < р> теги вокруг кнопки <> теги автоматически. Я прибегал к обмотке каждой кнопки <> с < div>, теперь Drupal оставляет ее в покое и не добавляет лишних тегов, поэтому следующая логика брата работает нормально. Окончательный код:
<!-- DRUPAL will wrap <button> tags with <p> tags if <button> tags are not enclosed with some sort of parent tag. Therefore, divs around them are needed. -->
<div>
<button class="accordion">Section 1</button>
<div class="panel">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
</div>
<div>
<button class="accordion">Section 2</button>
<div class="panel">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
</div>
<div>
<button class="accordion">Section 3</button>
<div class="panel">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
</div>
Попробуйте 'acc [i] .onclick = function (e) { var target = e.currentTarget; цель.classList.toggle ("активный"); target.nextElementSibling.classList.toggle ("show"); } ' –
К сожалению, такая же проблема с вышеуказанным кодом. Работает отлично при использовании из файла static.html, но при использовании на базовой странице Drupal или в статье (с режимом Full HTML), target.nextElementSibling выше возвращает NULL. – Alex
Какая версия Drupal? Я предлагаю вам взглянуть на [Обзор API JavaScript Drupal] (https://www.drupal.org/docs/8/api/javascript-api/javascript-api-overview). В частности, часть о Drupal.behaviors – 2pha