Я пытаюсь сделать подсказку, в которой пользователь должен ввести число в диапазоне от 1 до 4 (повторно запрашивается через цикл do-while, пока они не введут правильный номер), и это число будет соответствовать случаю в переключатель (который откроет новое окно). При тестировании код правильно выполняется вплоть до моего оператора ELSE, где код внезапно «забывает» число, которое пользователь вводит, чтобы выйти из цикла while, и, следовательно, не приводит пользователя к коду для каждого из случаев. в переключателе.
Testing : prompt = user inputs 5, new prompt: Invalid selection! please input a number between 1 and 4, user inputs 4, prompt closes.
Can anyone see why the reDirect variable in the IF statement doesn't make it into the switch?
Я приму любые предложения, но мне нужно дать пользователю «свободу» вводить числа, выходящие за пределы диапазона, чтобы доказать, что я могу обрабатывать ошибки.
Я попытался внедрить новые переменные в оператор if, но они тоже не включены в переключатель, который закрывается.
function reDirect() {
var reDirect = 0;
reDirect = parseInt(prompt("Input number between 1 and 4", "1"));
if (reDirect >=5 || reDirect <=0) {
var reDirect = 0
do reDirect = parseInt(prompt("Invalid! Input number between 1 and 4", "1"));
while (reDirect >=5 || reDirect <=0);
}
else
{
var element = document.getElementById("reDirect");
switch (reDirect) {
default:
break;
case 1:
window.open("URL","_blank","height=800px, width=800px");
break;
}
}
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вы не хотите, чтобы условно запускал switch — вы всегда хотите запускать switch, как только вы убедились, что ввод действителен.
Просто переместите switch из else, чтобы он работал независимо:
function reDirect() {
var reDirect = 0;
reDirect = parseInt(prompt("Input number between 1 and 4", "1"));
if (reDirect >= 5 || reDirect <= 0) {
do reDirect = parseInt(prompt("Invalid! Input number between 1 and 4", "1"));
while (reDirect >= 5 || reDirect <= 0);
}
var element = document.getElementById("reDirect");
switch (reDirect) {
case 1:
window.open("URL", "_blank", "height=800px, width=800px");
break;
// other cases
default: break; // ???
}
}
Также обратите внимание, что блоки объявления функций не должны иметь ;s в конце, и что, поскольку reDirect объявлен в верхней части функции, вы не должны пытаться повторно объявить ее с var внутри блока if. (Вы также можете добавить кейсы для случаев 2-4 или добавить что-то более значимое в кейс default)
Спасибо! Раньше я пытался удалить оператор ELSE; он сломал страницу, и я не мог понять, как заставить страницу работать без него. Это сэкономило мне часы! :-)
default стоит в конце switch:
switch (reDirect) {
case 1:
window.open("URL","_blank","height=800px, width=800px");
break;
default:
break;
}
Хотя это, безусловно, делает код более читаемым, интерпретатору на самом деле все равно — default будет работать, только если ни одно из case не выполнено, см. jsfiddle.net/8uy2c01b
Спасибо за предложение. Я перенесу его в конец.
Поместите значение по умолчанию в конце оператора switch:
function reDirect() {
var reDirect = 0;
reDirect = parseInt(prompt('Input number between 1 and 4', '1'));
if (reDirect >= 5 || reDirect <= 0) {
var reDirect = 0;
do
reDirect = parseInt(prompt('Invalid! Input number between 1 and 4', '1'));
while (reDirect >= 5 || reDirect <= 0);
} else {
var element = document.getElementById('reDirect');
switch (reDirect) {
case 1:
window.open('URL', '_blank', 'height=800px, width=800px');
break;
default:
break;
}
}
}
Некоторые изменения:
Вы можете изменить цикл получения значения, чтобы для него была только одна часть.
Вам нужно переместить часть default в конце оператора switch, потому что, если этот оператор найден, эта часть немедленно используется, и операторы switch заканчиваются.
Чтобы предотвратить использование NaN, вам нужно переключить условие, которое теперь также распространяется на значение NaN.
function reDirect() {
var reDirect;
do {
reDirect = parseInt(prompt("Input number between 1 and 4", "1"), 10);
} while (!(reDirect >= 1 && reDirect <= 4))
//var element = document.getElementById("reDirect");
console.info(reDirect);
switch (reDirect) {
case 1:
window.open("URL", "_blank", "height=800px, width=800px");
break;
default:
break;
}
}
reDirect();Спасибо за ваш ответ. Мне нужен был код для создания другой подсказки после первого неправильного ответа пользователя — например, («Пожалуйста, введите число от 1 до 4»), а затем («Неверный ввод, повторите попытку...»). Хотя теперь у меня есть ответ. Все хорошо. :-)
С помощью оператора if вы проверяете, является ли reDirect >=5||<=0, и делаете цикл do while без перехода к тому, что у вас есть в операторе else, рисуйте окно
function reDirect() {
var reDirect = 0;
reDirect = parseInt(prompt("Input number between 1 and 4", "1"));
if (reDirect >=5 || reDirect <=0) {
var reDirect = 0
do reDirect = parseInt(prompt("Invalid! Input number between 1 and 4", "1"));
while (reDirect >=5 || reDirect <=0);
draw();
}
else
{
draw();
}
}
function draw(){
var element = document.getElementById("reDirect");
switch (reDirect) {
default:
break;
case 1:
window.open("URL","_blank","height=800px, width=800px");
break;
}
На самом деле вы уже определили переменную reDirect и инициализировали ее значением 0. внутри, если вы ее повторно объявляете.
function reDirect() { var reDirect = 0; reDirect = parseInt(prompt("Input number between 1 and 4", "1")); if (reDirect >=5 || reDirect <=0) { //var reDirect = 0 reDirect = 0 do reDirect = parseInt(prompt("Invalid! Input number between 1 and 4", "1")); while (reDirect >=5 || reDirect <=0); } else { var element = document.getElementById("reDirect"); switch (reDirect) { default: break; case 1: window.open("URL","_blank","height=800px, width=800px"); break; } }
Ваш код отлично работает сразу после удаления "var reDirect"
function reDirect() {
var reDirect = 0;
reDirect = parseInt(prompt("Input number between 1 and 4", "1"));
if (reDirect >=5 || reDirect <=0) {
reDirect = 0
do reDirect = parseInt(prompt("Invalid! Input number between 1 and 4", "1"));
while (reDirect >=5 || reDirect <=0);
}
else
{
var element = document.getElementById("reDirect");
switch (reDirect) {
default:
break;
case 1:
console.info(1)
window.open("URL","_blank","height=800px, width=800px");
break;
}
}
}
reDirect()<p id = "reDirect">
what
</p>
Ага. Не удивлен — я только начал изучать JS в этом году.