JavaScript onchange, onblur и странность фокусировки в Firefox - PullRequest
1 голос
/ 09 января 2011

В моей форме есть поле скидок, в котором принимается сумма в долларах, которую нужно снять с общего счета (HTML, сгенерированный в PHP):

echo "<input id=\"discount\" class=\"text\" type=\"text\" name=\"discount\" onkeypress=\"return currency(this, event)\" onchange=\"currency_format(this)\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this); calculate_bill()\"/><br/><br/>\n";

Функция JavaScript calculate_bill вычисляет счет иснимает сумму скидки до тех пор, пока сумма скидки меньше общей суммы счета:

    if(discount != ''){

        if(discount - 0.01 > total_bill){
            window.alert('Discount Cannot Be Greater Than Total Bill');
            document.form.discount.focus();
        }

        else{
            total_bill -= discount;
        }

    }

Проблема в том, что даже если скидка превышает общую сумму счета, фокус не возвращается к скидке.поле.Я попытался вызвать функцию calculate_bill с помощью onchange, но ни IE, ни Firefox не вернут фокус в поле скидки, когда я сделаю это таким образом.Когда я звоню calculate_bill с onblur, это работает в IE, но все еще не работает в Firefox.Я также попытался использовать окно подтверждения вместо окна предупреждения, но оно тоже не сработало (плюс я не хочу две кнопки, я только кнопку «ОК»).

Как я могу гарантировать, что фокус возвращается в поле скидки после того, как пользователь покинул это поле, щелкнув другое поле или вкладку, ЕСЛИ сумма скидки превышает общую сумму счета?

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Возможно, вы захотите попробовать метод, описанный здесь: Javascript / Firefox / onBlur

Я не пробовал сам, но по сути он предлагает заменить document.form.discount.focus() на

setTimeout(function() {document.form.discount.focus();}, 1);

Я подозреваю, что основная проблема заключается в том, что когда вы нажимаете на вкладку (например), браузер проходит несколько шагов: вызовите код, связанный с текущим элементом управления (onchange, onblur), затем установите фокус нановый контроль.Таким образом, если вы измените фокус на первом шаге, то фокус все равно будет немедленно сброшен на следующем шаге.Отсюда и обходной путь по таймеру.

0 голосов
/ 09 января 2011

Вам лучше конвертировать скидку в число, когда вы используете ее при сравнении чисел.Измените ваш скрипт на:

if(discount != ''){
        discount = parseFloat(discount);
        if(discount - 0.01 > total_bill){
            window.alert('Discount Cannot Be Greater Than Total Bill');
            document.form.discount.focus();
        }

        else{
            total_bill -= discount;
        }

    }
...