2010-01-13 2 views
1

Когда это событие обмена в IE возвращает false, IE-фокус остается на этом поле ввода. В Firefox фокус всегда перемещается в следующее поле независимо от него.Javascript onchange different в IE и FireFox

HTML:

input name="seminar_donation" type="text" id="seminar_donation" 
onchange="return CheckTotal(this);" 

JavaScript:

function CheckTotal(inputbox) { 
    if (isNaN(parseInt(inputbox.value))) { 
     alert("Please enter only digits 0-9"); 
     inputbox.focus(); 
     return false; 
    } 
    return true; 
} 

В IE я даже не нужно inputbox.focus(), который, к сожалению, не появляется, чтобы сделать что-нибудь в Firefox, чтобы сохранить фокус на ошибочном поле ввода. Как я могу заставить Firefox оставаться в этом окне ввода?

ответ

-1

Вы пытались добавить «возврат» в атрибуте onchange? то есть

<input name="seminar_donation" type="text" id="seminar_donation" onchange="return CheckTotal(this);"> 

Я не совсем уверен, что это сработает, но стоит попробовать?

Редактирование: пояснить, причина, по которой я не уверен, что я обычно подхожу к этому по-другому и привязываю обработчик события в javascript, а не в html.

+0

О да, я пробовал его с возвратом, не имеет значения. –

+0

Я изменил источник, чтобы «вернуть CheckTotal (это) в интересах других зрителей. –

1

Ответ, который больше не кажется здесь предложенным вопросом «времени», хотя и на немного другой теме. Так что я гугле «тайм-аут» и нашел блог Майка Rankin с 2005, что позволило мне решить эту проблему путем изменения фокуса() на:

var t= setTimeout('document.getElementById("seminar_donation").focus()',1); 

Так что же происходит Firefox все еще идет к следующему полю, но 1 мс позже этот код возвращает фокус обратно в ошибочное поле. Это cludgy, потому что, если в этом следующем поле есть облачное событие, то onblur начнет срабатывать, когда таймаут заставит фокус вернуться. Но это работа вокруг, по-видимому, давней ошибки в Firefox.

+0

idem comment like @ Dave.Sol – helios

+0

Вам даже не нужно, чтобы длина таймаута была 1, это может быть 0 - выполнение таймера в очереди до тех пор, пока поток не будет работать, поэтому текущий список событий имеет приоритет. –

1
setTimeout('document.getElementById("seminar_donation").focus()',1); 
+0

Я предполагаю, что вы отвечаете на это, потому что Firefox сначала вызывает ваш обработчик событий, а NEXT фокусирует следующий вход, переопределяет focus() в обработчике. В этом случае то, что он делает говорит javascript для выполнения позже (1 мс). Javascript является монопоточным, поэтому он аналогичен «вызывается после того, как вы закончили все это». – helios

+0

@helios, да, это происходит, как вы описали его. –