Javascript требуется два клика, чтобы инициализировать то, что я хотел бы, чтобы он делал

#javascript

#javascript

Вопрос:

Я создаю базовую функцию, которая при нажатии позволит созданной мной кнопке изменять цвет фона со стандартного светло-серого, который я установил с помощью css, на красный, при каждом нажатии он должен меняться с одного на другой или наоборот. проблема, с которой я сталкиваюсь, заключается в том, что при первом нажатии он остается светло-серым, затем при втором нажатии он становится красным, и оттуда он переключается одним щелчком мыши.

Я пытаюсь использовать это как стандартную функцию «простите, если это неподходящий жаргон для этого», мне также любопытно, как это можно сделать как функцию со стрелкой, поскольку это означало, что я мог бы изменить ее со светло-серого на красный, но не обратно на светло-серый.

 let redBtn = document.getElementById('redBtn');
redBtn.addEventListener('click', function() {
 const bgColor = redBtn.style.background;
  if (bgColor == 'lightgray') {
   redBtn.style.background = 'red';
  } else {
  redBtn.style.background = 'lightgray';
 }
 });
  

также функция arrow, если вы не возражаете, также дает представление об этой проблеме, спасибо!

 let red = document.getElementById('redBtn');
 red.addEventListener('click', () => {
  red.style.background = 'red';
  if (red == 'lightgray') {
  red.style.background = 'red';
  } else {
  red.style.background = 'lightgray';   
 `enter code here` });
  

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

1. Спасибо всем за обратную связь, я смог заставить его работать с первого «щелчка»!

Ответ №1:

При первом щелчке доступ к background свойству вернет пустую строку, даже если CSS установил для нее значение lightgray :

 console.log(
  document.querySelector('div').style.background === ''
);  
 .foo {
  background-color: red;
}  
 <div class="foo">foo</div>  

Если вы хотите изменить его на red when the background lightgray , проверьте, является ли это lightgray или пустой строкой:

 let redBtn = document.getElementById('redBtn');
redBtn.addEventListener('click', function() {
  const bgColor = redBtn.style.background;
  if (bgColor == 'lightgray' || bgColor === '') {
    redBtn.style.background = 'red';
  } else {
    redBtn.style.background = 'lightgray';
  }
});
  

Или, может быть, было бы приятнее переключить if / else — просто проверьте, есть ли фон red , и если да, назначьте ему lightgray . Вы можете использовать условный оператор здесь, чтобы уменьшить объем кода, если хотите:

 let redBtn = document.getElementById('redBtn');
redBtn.addEventListener('click', () => {
  const bgColor = redBtn.style.background;
  redBtn.style.background = bgColor === 'red'
  ? 'lightgray'
  : 'red';
});
  

Функция со стрелкой здесь не имеет значения, потому что вы не ссылаетесь this или вызываете функцию как конструктор.

Ответ №2:

 const bgColor = redBtn.style.background;
  

Возвращает больше, чем просто цвет. Фактически он возвращает строку с восемью свойствами.
Итак, при первом нажатии он не соответствует «lightgray», потому что возвращаемая строка может быть, например, «lightgray none repeat scroll 0% 0%».

Чтобы получить только цвет фона, используйте это:

 const bgColor = redBtn.style.backgroundColor;
  

Ответ №3:

Давайте установим красный фон, как вы хотели сначала:

 // You wanted a function, so we added the onclick=""
<button id="redBtn" onclick="change()" style="background: red">Click</button>
  

Поскольку вы хотели функцию со стрелкой.

 function change() { }
// Same as
change = () => { }
  

Троичный оператор в основном говорит:

 bg === 'red' ? btn.style.background = 'lightgrey' : btn.style.background = 'red';
// Same as
if (background === red) { 
// Change to lightgrey 
} else { 
    // red
}
  

 let btn = document.getElementById('redBtn'); // Get button 
// Arrow function
change = () => {
  const bg = btn.style.background; // Grab background color
  // Ternary
  bg === 'red' ? btn.style.background = 'lightgrey' : btn.style.background = 'red';

}  
 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<button id="redBtn" onclick="change()" style="background: red">Click</button>