JS-скрипт работает только с одной html-картой, а не со всеми

Таким образом, этот скрипт изменяет валюту и символ, если я выбрал валюту из тега выбора в html, но проблема в том, что он меняет валюту и символ только для первой карты, а для остальных нет. Есть ли способ изменить их все одновременно, не создавая скрипт для каждой карты? Выбор работает следующим образом: если бы я выбрал LBP и валютой был доллар США, то число было бы умножено на 8500, а если бы я выбрал доллар США с валютой в LBP, тогда оно было бы разделено на 8500, а если бы я выбрал ту же валюту, которая выбрано, то ничего не происходит.

HTML:

<div class = "card">
        <img class = "imgcar" src = "cars/402088-2020-land-rover-range-rover-velar.jpg" alt = "Avatar" style = "width:16em">
        <div class = "container">
          <h4><b>Range Rover Velar</b><br><b>4 Doors</b><br><b> 5 Passengers</b> </h4>
          <div><p id = "price">100</p><p id = "symbol">$</p><p id = "duration">/24hrs</p></div>
        </div>
      </div>
      <div class = "card">
        <img class = "imgcar" src = "cars/2020-BMW-M8-Competition-Convertible-02-e1570483239877.jpg" alt = "Avatar"
          style = "width: 16em;">
        <div class = "container">
          <h4><b>BMW M8</b><br><b>2 Doors</b><br><b> 2 Passengers</b></h4>
          <p id = "price">150</p><p id = "symbol">$</p><p id = "duration">/24HRS</p>
        </div>
      </div>

JS:

function report(currencyy) {
var price = document.getElementById("price");
var symbol = document.getElementById("symbol");

if (currencyy == "lbp") {
  if (symbol.textContent == "$") {
    symbol.textContent = "lbp";
    var text = price.textContent;
    var number = parseInt(text) * 7500;
    price.textContent = number;
  }
 }
 if (currencyy == "usd") {
  if (symbol.textContent == "lbp") {
    symbol.textContent = "$";
    var text = price.textContent;
    var number = parseInt(text) / 7500;
    price.textContent = number;
  }
 }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых, очень плохая идея дублировать удостоверение личности... Document.getElementById() возвращает только один DOM element, поэтому мой совет: используйте классы, а затем используйте Document.getElementsByClassName() или:

node.querySelectorAll('.yourClassName').forEach(element => {
  // Your code
})

Я использовал document.getElementByClassName(), но он перестал работать, раньше он менял валюту первой карты, а теперь нет. (Я отредактировал html для класса вместо идентификатора)

Firas Rihan 24.12.2020 15:41

Вы имеете в виду document.getElementsByClassName()? document.getElementByClassName() не существует, возможно, поэтому он не работал.

FahDev 24.12.2020 15:45

вы упомянули выше, чтобы использовать document.getElementsByClassName() вместо этого, если идентификатор один

Firas Rihan 24.12.2020 15:47
Ответ принят как подходящий

Используйте document.querySelectorAll() и перебирайте узлы карточек:

const currencies = { //--> store the currency data
  lbp: {
    symb: "lbp",
    fn: value => Number(value) * 7500
  },
  usd: {
    symb: "$",
    fn: value => Number(value) / 7500
  }
};

function report(currencyy) {
  var cardNodes = document.querySelectorAll(".card");
  Array.from(cardNodes).forEach(card => { // --> update the card node data
    const symbNode = card.querySelector("#symbol");
    const priceNode = card.querySelector("#price");
    const { symb, fn } = currencies[currencyy];
    if (symbNode.textContent === symb) return;
    symbNode.textContent = symb;
    priceNode.textContent = fn(priceNode.textContent);
  });

  
}

report("usd");
<div id = "app"></div>
<div class = "card">
    <img class = "imgcar" src = "cars/402088-2020-land-rover-range-rover-velar.jpg" alt = "Avatar" style = "width:16em">
    <div class = "container">
        <h4><b>Range Rover Velar</b><br><b>4 Doors</b><br><b> 5 Passengers</b> </h4>
        <div>
            <p id = "price">100</p>
            <p id = "symbol">$</p>
            <p id = "duration">/24hrs</p>
        </div>
    </div>
</div>
<div class = "card">
    <img class = "imgcar" src = "cars/2020-BMW-M8-Competition-Convertible-02-e1570483239877.jpg" alt = "Avatar"
          style = "width: 16em;">
    <div class = "container">
        <h4><b>BMW M8</b><br><b>2 Doors</b><br><b> 2 Passengers</b></h4>
        <p id = "price">150</p>
        <p id = "symbol">$</p>
        <p id = "duration">/24HRS</p>
    </div>
</div>

Другие вопросы по теме