Функция в операторе ELSE выполняется также с оператором IF, как это предотвратить? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь сделать этот код выполненным, только если есть совпадение между двумя значениями, и я использую оператор if / else, и я помещаю другую функцию, чтобы изменить цвет фона на красный в "ELSE" утверждении но он также выполняется, даже если условия не выполняются ... Когда я нажимаю первую кнопку "кнопка сша" , она выполняется очень хорошо, но при нажатии на любую из двух других кнопок она выполняется эти два оператора, то есть напишите «Да, соответствует» и измените цвет фона, хотя он есть в выражении ELSE .. как я могу остановить это ??? Вот мой код

const words = {
  "united states": "us",
  "united kingdoms": "uk",
  "united nations": "un",
};

function check(val) {

  for (word in words) {
    if (val == word) {
      document.getElementById('debug').innerHTML = "Yes, Matched";
      break;
    } else {
      document.getElementById('debug').innerHTML = "No Match";
      bgRed();

    }
  }
};

function bgRed() {
  for (i = 0; i < 3; i++) {
    document.getElementsByTagName('input')[i].style.background = 'red';
  }
}
* {
  text-align: center
}

input {
  margin: 30px;
}
<input type="button" value="united states" onclick="check(this.value)"><br>
<input type="button" value="united kingdoms" onclick="check(this.value)"><br>
<input type="button" value="united nations" onclick="check(this.value)">
<div id="debug"></div>

Ответы [ 3 ]

6 голосов
/ 02 апреля 2020

причина в for (word in words) l oop, представьте, что вы пытаетесь сопоставить все варианты в списке words.

Причина, по которой только Соединенные Штаты не краснеют, заключается в том, что петли перерыв перед тем, как перейти к оператору else.

То, что вам нужно, это, вероятно,

var found = false;
for (word in words) {
    if (val == word) {
      document.getElementById('debug').innerHTML = "Yes, Matched";
      found = true;
      break;
    }
}
if found == true {
 // do something
} else {
 // do something else
}

4 голосов
/ 02 апреля 2020

Проблема в том, что вы выполняете действие внутри l oop, где вы проходите l oop через все элементы в words объекте.

В случае с "соединенными штатами" это первый элемент в списке, поэтому код переходит в блок «yes matched», а затем прекращает цикл из-за break. Но во втором и третьем случаях у него есть шанс go в else на первом l oop, потому что он не совпадает. И там вы установите красный фон. Но вы никогда не меняете фон снова на более поздних циклах.

Лучшим решением было бы дождаться окончания l oop, прежде чем предпринимать какие-либо видимые действия. Вместо этого просто установите флаг внутри l oop, который вы позже используете, чтобы решить, какое действие предпринять.

Демо:

const words = {
  "united states": "us",
  "united kingdoms": "uk",
  "united nations": "un",
};

function check(val) {
  var match = false;
  for (word in words) {
    if (val == word) {
      match = true;
      break;
    }
  }

  if (match == true) {
    document.getElementById('debug').innerHTML = "Yes, Matched";
  } else {
    document.getElementById('debug').innerHTML = "No Match";
    bgRed();
  }
};

function bgRed() {
  for (i = 0; i < 3; i++) {
    document.getElementsByTagName('input')[i].style.background = 'red';
  }
}
* {
  text-align: center
}

input {
  margin: 30px;
}
<input type="button" value="united states" onclick="check(this.value)"><br>
<input type="button" value="united kingdoms" onclick="check(this.value)"><br>
<input type="button" value="united nations" onclick="check(this.value)">
<div id="debug"></div>
2 голосов
/ 02 апреля 2020

В вашем для l oop вы просматриваете все три ключа в словаре. Так как первым ключом является United States, оператор if в первом случае l oop будет иметь значение true, а l oop обрывается.

Когда вы проверяете другие значения, оператор if в первом итерации для l oop приведут к ложному результату, а оператор else будет выполнен. После первых итераций ключ будет совпадать, и оператор if будет иметь значение true, но это после того, как фон уже был изменен.

Я считаю, что вам нужно только выполнить операторы else после l oop проверил все ключи и совпадений нет, попробуйте следующий код:

var found = false;
for (word in words) {
    if (val == word) {
        document.getElementById('debug').innerHTML = "Yes, Matched";
        found = true;
        break;
    }
}
if (found == false) {
    document.getElementById('debug').innerHTML = "No Match";
    bgRed();
}
...