Как изменить значение переменной в зависимости от функции?

#javascript #html

#javascript #HTML

Вопрос:

Я пытаюсь создать небольшую программу, которая показывает, сколько времени требуется определенному транспортному средству для обращения вокруг планеты. Например, автомобиль со скоростью 100 миль в час облетает Землю (7917 миль) за 79,17 часов и т. Д.

Для отображения транспортных средств я использовал значки, а для отображения планет я использовал img. Я могу присвоить значения значкам (в данном случае я присвоил им значения скорости в милях в час) Но для изображений я по какой-то причине не могу дать значения, которые я хотел использовать в качестве радиуса планет.

В настоящее время у меня есть

  let icons = [...document.querySelectorAll('.icon-container .fa')];
 let answerContainer = document.getElementById("answer-container");
 let answerDiv = document.getElementById("answer-div");
 let planetImgs = [...document.querySelectorAll(".planet-container img")];


//Function to slide icons User clicks right/left to show next/previous vehicle icon

 function adjustActive (adjustment) { 
 var current = icons.find(it => it.id === 'active'); 
 var currentIndex = icons.indexOf(current);
 var nextIndex = (currentIndex   adjustment) % icons.length;

 if (nextIndex < 0) nextIndex = icons.length - 1;
current.removeAttribute('id');
icons[nextIndex].id = 'active'; 

// Action to find Orbital Period
let planet = 7917.5;  **(I WANT THIS TO CHANGE DEPENDING ON THE FUNCTION BELOW)**
let nextElement = document.getElementById("active");
let nextElements = nextElement.getAttribute("value")
let orbitalPeriod = planet / nextElements;

answerDiv.innerHTML = orbitalPeriod.toFixed(2);

}

// Function to slide planets - User clicks right/left to show next/previous planet

function adjustActivePlanet (adjustment) { 
var current = planetImgs.find(it => it.id === 'active-planet'); 
var currentIndex = planetImgs.indexOf(current);
var nextIndex = (currentIndex   adjustment) % icons.length;

if (nextIndex < 0) nextIndex = planetImgs.length - 1;
current.removeAttribute('id');
planetImgs[nextIndex].id = 'active-planet'; 

} // The value of this function needs to be used in the function above for let "planets"

//Arrow Buttons

document.querySelector('#left-arrow').addEventListener('click', e => adjustActive(-1));
document.querySelector('#right-arrow').addEventListener('click', e => adjustActive(1));
document.querySelector('#left-arrow-planet').addEventListener('click', e => adjustActivePlanet(-1));
document.querySelector('#right-arrow-planet').addEventListener('click', e => adjustActivePlanet(1));



    <div class="main-container">
    <div class="object-container">
        <div class="icon-container">
            <i class="fa fa-car" id="active" value="100"></i>
            <i class="fa fa-bicycle" value="25"></i>
            <i class="fa fa-plane" value="500"></i>
            <i class="fa fa-ship" value="10"></i>
            <i class="fa fa-fighter-jet" value="1000"></i>
            <i class="fa fa-space-shuttle" value="3000"></i>
        </div>
        <div class="arrow-buttons">
            <a href="#" class="right-arrow" id="right-arrow"></a>
            <a href="#" class="left-arrow" id="left-arrow"></a>
        </div>
        </div>
            <div class="answer-container" id="answer-container">
            <div id="answer-div"></div>
            <h3>Hours to orbit</h3>
        </div>
        <div class="planet-container">
            <img src="images/earth planet.png" alt="" id="active-planet">
            <img src="images/saturn planet.png" alt="" class="planet">
            <img src="images/neptune planet.png" alt="" class="planet">
            <img src="images/mercury planet.png" alt="" class="planet">
            <img src="images/sun.png" alt="" class="planet">
            <img src="images/mars planet.png" alt="" class="planet">
            <div class="arrow-buttons">
                <a href="#" class="right-arrow" id="right-arrow-planet"></a>
                <a href="#" class="left-arrow" id="left-arrow-planet"></a>
            </div>  
        </div>
    </div>
</div>
 

Как вы можете видеть выше, пусть планета = 7917,5 — это радиус земли, поэтому контейнер ответов выведет значение «планета» / значение активных значков «активный». Как я могу изменить значение «планеты» в зависимости от того, какая планета в данный момент активна («active-planet»). Например, Нептун равен 30 000, поэтому я хочу, чтобы значение «планета» было 30 000 / значение значка (автомобиль 100 миль в час).

Любая помощь будет принята с благодарностью.

Ответ №1:

Вместо использования value атрибута вы можете использовать data-<name> атрибут.

ie.

 <img src="images/neptune planet.png" alt="" class="planet" data-radius="30000">
 

Затем вы можете получить доступ к этому значению с помощью:

 document.querySelector('#active-planet').dataset.radius
 

РЕДАКТИРОВАТЬ: я добавил пример выполняемого фрагмента, чтобы показать, как я буду подходить к вашей программе.

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

В этом случае я создал setActiveClasses() функцию и renderOrbitDuration() функцию.

Мы отслеживаем активное транспортное средство и планету, Используя индекс (0, 1, 2 и т. Д.) Для каждого ( activeVehicleIndex и activePlanetIndex ).

Кнопки просто увеличивают и уменьшают соответствующий индекс, а затем setActiveClasses() функция и renderOrbitDuration() функция используют этот индекс для установки правильных активных классов и отображения продолжительности обращения.

Прочитайте и запустите фрагмент ниже.

 let activeVehicleIndex = 0
let activePlanetIndex = 0

const vehicleElements = document.querySelectorAll('.vehicles i')
const planetElements = document.querySelectorAll('.planets img')

function setActiveClasses () {
  // Clear old active classes
   [...vehicleElements, ...planetElements].forEach(el => {
    el.classList.remove('active')
  })
  
  // Add new active classes
  vehicleElements[activeVehicleIndex].classList.add('active')
  planetElements[activePlanetIndex].classList.add('active')
}

function renderOrbitDuration () {
  activeVehicleEl = vehicleElements[activeVehicleIndex]
  activePlanetEl = planetElements[activePlanetIndex]
  
  const html = `
    Vehicle Name: ${activeVehicleEl.dataset.name}<br>
    Vehicle Speed: ${activeVehicleEl.dataset.speed}<br>
    Planet Name: ${activePlanetEl.dataset.name}<br>
    Planet Radius: ${activePlanetEl.dataset.radius}<br>
    Orbital Period: ${activePlanetEl.dataset.radius / activeVehicleEl.dataset.speed}
  `
  
  document.querySelector('.output').innerHTML = html
}

// Previous/Next Button Listeners
document.querySelector('.vehicles .prev').addEventListener('click', () => {
  activeVehicleIndex-- // Decrement activeVehicleIndex
  if (activeVehicleIndex < 0) { activeVehicleIndex = 0 } // Dont allow negative values
  setActiveClasses()
  renderOrbitDuration()
})

document.querySelector('.vehicles .next').addEventListener('click', () => {
  activeVehicleIndex   // Increment activeVehicleIndex
  if (activeVehicleIndex > vehicleElements.length - 1) { activeVehicleIndex = vehicleElements.length - 1 } // Dont allow values greater than number of vehicles
  setActiveClasses()
  renderOrbitDuration()
})

document.querySelector('.planets .prev').addEventListener('click', () => {
  activePlanetIndex-- // Decrement activePlanetIndex
  if (activePlanetIndex < 0) { activePlanetIndex = 0 } // Dont allow negative values
  setActiveClasses()
  renderOrbitDuration()
})

document.querySelector('.planets .next').addEventListener('click', () => {
  activePlanetIndex   // Increment activePlanetIndex
  if (activePlanetIndex > planetElements.length - 1) { activePlanetIndex = planetElements.length - 1 } // Dont allow values greater than number of planets
  setActiveClasses()
  renderOrbitDuration()
})

// Run both of these once on page load to set initial classes and render values
setActiveClasses()
renderOrbitDuration() 
 .vehicles, .planets {
  margin-bottom: 1em;
}

.vehicles .active {
  color: red;
}

.planets .active {
  border: 1px solid red;
} 
 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" rel="stylesheet"/>

<!-- Vehicles -->
<div class="vehicles">
  <i class="fa fa-car" data-name="car" data-speed="100"></i>
  <i class="fa fa-bicycle" data-name="bike" data-speed="25"></i>
  <i class="fa fa-plane" data-name="plane" data-speed="500"></i>
  <i class="fa fa-ship" data-name="ship" data-speed="10"></i>
  <i class="fa fa-fighter-jet" data-name="fighter jet" data-speed="1000"></i>
  <i class="fa fa-space-shuttle" data-name="space shuttle" data-speed="3000"></i>
  <div>
    <button class="prev">Prev</button>
    <button class="next">Next</button>
  </div>
</div>

<!-- Planets -->
<div class="planets">
  <img src="http://via.placeholder.com/50" data-name="earth" data-radius="6000"/>
  <img src="http://via.placeholder.com/50" data-name="saturn" data-radius="60000"/>
  <img src="http://via.placeholder.com/50" data-name="neptune" data-radius="25000"/>
  <img src="http://via.placeholder.com/50" data-name="mercury" data-radius="2500"/>
  <img src="http://via.placeholder.com/50" data-name="sun" data-radius="700000"/>
  <img src="http://via.placeholder.com/50" data-name="mars" data-radius="3500"/>
  <div>
    <button class="prev">Prev</button>
    <button class="next">Next</button>
  </div>
</div>

<!-- Output -->
<div class="output"></div> 

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

1. Как я могу получить доступ к радиусу данных? Будет ли это let planet = active-planet.dataset.radius ? Это было бы идеально!

2. Это не работает, кажется, я не могу получить доступ к data-radius и применить его к моей переменной «planets»/

3. Попробуйте document.querySelector('#active-planet').dataset.radius

4. Я выполнил let currentPlanet = document.getElementById(«active-planet»); и let planet = currentPlanet.dataset.radius; Похоже, он получает данные для земли, но не для других «активных» планет, когда они активны

5. Я добавил доступный для выполнения пример, который должен помочь