Приглашение Javascript отменено, не работает в цикле while

У меня есть подсказка, которая в основном является обязательным полем и не может содержать десятичную дробь. У меня есть цикл while, который должен продолжать запрашивать у пользователя информацию до тех пор, пока не будет указано число, независимо от того, нажаты ли кнопки «ОК» или «Отмена». Все работает нормально, пока нажата кнопка ОК. Он продолжает запрашивать, если поле оставлено пустым и нажата кнопка «ОК» или если указано десятичное число и нажата кнопка «ОК». Но если щелкнуть кнопку «Отмена», он не будет продолжать запрашивать.

var rmiles = prompt("Please indicate actual miles driven for payroll");
    while (rmiles == null | rmiles == "null" | rmiles == " " | rmiles.indexOf(".") != -1) {
        alert("Mileage is required when arriving on site and can only be whole numbers.  No Decimals.  Please enter 0 if you did not intend to arrive on site.");
        rmiles = prompt("Please indicate actual miles driven for payroll");
    }

person jmease    schedule 13.10.2011    source источник
comment
Это звучит как антихрист пользовательского опыта. Есть ли причина, по которой вы используете подсказки и оповещения вместо обязательного поля в лайтбоксе или что-то подобное?   -  person jbabey    schedule 13.10.2011


Ответы (2)


Я считаю, что проблема в вашем состоянии while — вы делаете побитовое ИЛИ | на всех условиях. Это означает, что rmiles.indexOf(".") всегда вызывается, даже если rmiles устанавливается на null с помощью prompt при нажатии кнопки "Отмена". Это связано с тем, что побитовое ИЛИ не приведет к короткому замыканию.

Попробуйте логическое ИЛИ ||, которое выполняет короткое замыкание и, таким образом, позволяет избежать нулевого ошибка ссылки:

while (rmiles == null || /*...*/
person jball    schedule 13.10.2011
comment
Это полностью сработало. Я приму ваш ответ через несколько минут, как только эта штука мне позволит. Спасибо! - person jmease; 13.10.2011

Поскольку rmiles имеет значение null, когда пользователь нажимает "отмена"... поэтому rmiles.indexOf выдает ошибку/исключение и завершает цикл.

person Richard JP Le Guen    schedule 13.10.2011