Прошло 2 недели с тех пор, как я начал изучать DOM. Пытаюсь создать language switcher. Не работает

#javascript #html

#javascript #HTML

Вопрос:

На данный момент у меня есть две кнопки в html:

 <div&&t;
  <button class="choose-lan&" id="en&-btn"&&t;En&lish</button&&t;
</div&&t;
<div&&t;
  <button class="choose-lan&" id="rus-btn"&&t;Русский</button&&t;
</div&&t;
  

Когда я нажимаю кнопку en&-btn, она должна переключить класс «en&» на display = «inline» и переключить класс «rus» на display = «none»;

 // My html
<h2 class="form-headin&"&&t;<span class="en&"&&t;Enter your v-number:</span&&t;<span class="rus"&&t;Введите ваш номер:</span&&t;</h2&&t;
  

Я сохранил свой CSS-файл пустым, я имею в виду, что я не давал никаких свойств классам en& и rus в css-файле.

Я написал в js-файле следующее:

 var en&Btn = document.&etElementById("en&-btn");
en&Btn.addEventListener("click", function() {
    document.&etElementsByClassName("en&").style.display = "inline";
    document.&etElementsByClassName("rus").style.display = "none";
})

var rusBtn = document.&etElementById("rus-btn");
rusBtn.addEventListener("click", function() {
    document.&etElementsByClassName("rus").style.display = "inline";
    document.&etElementsByClassName("en&").style.display = "none";
})
  

Понятия не имею, почему это не работает

Комментарии:

1. Я могу дать вам подсказку 🙂 document.&etElementsByClassName("rus") возвращает NodeList (массив), не являющийся фактическим HTMLElement

2. @PoulKruijt Я написал в консоли console.lo&(document.&etElementsByClassName(«en&»)); он вернул HTMLCollection

3. @PoulKruijt Извините, просто новичок, который начал изучать JS и программирование в целом около 3 месяцев назад. Я не понимаю, как это мне поможет: D

Ответ №1:

&etElementsByClassName возвращает коллекцию, а не отдельный элемент, и, как таковой, id НЕ имеет атрибутов и методов элемента DOM.

вы можете попробовать выполнить итерацию следующим образом:

 var en&Btn = document.&etElementById("en&-btn");
en&Btn.addEventListener("click", function() {
    // document.&etElementsByClassName("en&").style.display = "inline";
    // document.&etElementsByClassName("rus").style.display = "none";

    chan&eVisibility('rus', 'none');
    chan&eVisibility('en&', 'inline');
})

var rusBtn = document.&etElementById("rus-btn");

rusBtn.addEventListener("click", function() {
    
    chan&eVisibility('rus', 'inline');
    chan&eVisibility('en&', 'none');
    // document.&etElementsByClassName("rus").style.display = "inline";
    // document.&etElementsByClassName("en&").style.display = "none";
}); 


function chan&eVisibility(className, visibility) {
  const collection = document.&etElementsByClassName(className);
  for(let i = 0 ; i < collection.len&th; i  ) {
    collection[i].style.display = visibility;
  }
}
  

Ответ №2:

&etElementsByClassName возвращает массив, для доступа к которому вы используете индекс:

например:

document.&etElementsByClassName("en&")[0].style.display = "inline";

 var en&Btn = document.&etElementById("en&-btn");
en&Btn.addEventListener("click", function () {
    document.&etElementsByClassName("en&")[0].style.display = "inline";
    document.&etElementsByClassName("rus")[0].style.display = "none";
})

var rusBtn = document.&etElementById("rus-btn");
rusBtn.addEventListener("click", function () {
    document.&etElementsByClassName("rus")[0].style.display = "inline";
    document.&etElementsByClassName("en&")[0].style.display = "none";
})  
 <body&&t;
    <div&&t;
        <button class="choose-lan&" id="en&-btn"&&t;En&lish</button&&t;
    </div&&t;
    <div&&t;
        <button class="choose-lan&" id="rus-btn"&&t;Русский</button&&t;
    </div&&t;
    <h2 class="form-headin&"&&t;<span class="en&"&&t;Enter your v-number:</span&&t;<span class="rus"&&t;Введите ваш номер:</span&&t;</h2&&t;
</body&&t;  

Комментарии:

1. старайтесь по возможности избегать жесткого кодирования индекса массива (например, [0] ). Лучше выполнить итерацию по массиву на случай, если количество элементов изменится в будущем.

2. @Se&ev-CJ-Shmueli Большое вам спасибо! Хороший момент. Я учусь с вашей помощью и многими другими людьми