Проблема с оператором IF, переносящим значение переменной в переключатель

Я пытаюсь сделать подсказку, в которой пользователь должен ввести число в диапазоне от 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;
        }
    }

};

Ага. Не удивлен — я только начал изучать JS в этом году.

lhunt04 15.05.2019 08:59
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
41
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Похоже, вы не хотите, чтобы условно запускал 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; он сломал страницу, и я не мог понять, как заставить страницу работать без него. Это сэкономило мне часы! :-)

lhunt04 15.05.2019 08:41

default стоит в конце switch:

switch (reDirect) {
    case 1:
        window.open("URL","_blank","height=800px, width=800px");
        break;
    default:
        break;
}

Хотя это, безусловно, делает код более читаемым, интерпретатору на самом деле все равно — default будет работать, только если ни одно из case не выполнено, см. jsfiddle.net/8uy2c01b

CertainPerformance 15.05.2019 08:29

Спасибо за предложение. Я перенесу его в конец.

lhunt04 15.05.2019 08:40

Поместите значение по умолчанию в конце оператора 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 заканчиваются.

  • Для разбора числа вам нужна система счисления с parseInt.

  • Чтобы предотвратить использование 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»), а затем («Неверный ввод, повторите попытку...»). Хотя теперь у меня есть ответ. Все хорошо. :-)

lhunt04 15.05.2019 08:55

С помощью оператора 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>

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