Как установить фокус на поле ввода в методе, вызываемом после события onchange ()? - PullRequest
0 голосов
/ 20 января 2009

У меня проблемы с настройкой фокуса на поле ввода после его проверки.

У меня есть 2 поля: от и до.

   <spring:message code="template.fields.label.from"/>: 
       <mvc:input  path="templateFields.selectorRangeFrom" 
       onchange="validateNumber('templateFields.selectorRangeFrom',true)"/>
   <spring:message code="template.fields.label.to"/>: 
      <mvc:input path="templateFields.selectorRangeTo"   
     onchange="validateNumber('templateFields.selectorRangeTo',true)"/>

И у меня есть метод validateNumber (), который проверяет поле и возвращает false, если поле недопустимо, в противном случае - true. Однако фокус никогда не остается на неверном номере, он всегда будет идти за следующим объектом.

function validateNumber(index,isInteger) {
 var object = document.getElementById(index);
 var value = object.value;   
 if (testNumeric2(value,isInteger)==false)   {
     alert('Please correct the value: ' + value);               
     object.focus();
     object.select();
     return false;  
 } 
return true;    
 }    

Я обнаружил, что если я добавлю: event.returnValue = false (до возврата false), то это работает для IE. Но я не могу найти решение для Firefox.

Спасибо за любые предложения, Матал

Ответы [ 2 ]

4 голосов
/ 20 января 2009

setTimeout () позволяет вам отложить выполнение функции на несколько миллисекунд - если вы используете ноль, это просто означает: «сделайте это, как только вы закончите с чем угодно» «делаю сейчас» - обработка события, в вашем случае.

Попробуйте это:

if (! /** check field **/) {
   /** show error **/
   setTimeout((function() { object.focus() }), 0);
}

По сути, вы будете создавать функцию, которая будет фокусировать ваше поле ввода, а затем давать браузеру указание вызвать его, как только он завершит обработку события по умолчанию.

0 голосов
/ 20 января 2009

Я не уверен, что должно означать возвращение false для onChange . Если вы просто хотите перефокусировать проблемную область, я бы посоветовал вам сделать это с помощью вызова setTimeout () (вам нужно создать замыкание вокруг вашего элемента ввода).

Таким образом обработка события будет завершена, когда вы попытаетесь сфокусировать текстовое поле.

В качестве примечания, я бы также предложил, чтобы вы не использовали alert () для уведомления пользователя об ошибке, так как она раздражает и может вызывать резкий неожиданный звук во многих системах Windows , Отображение значка рядом с красной рамкой или контроль за ней может быть гораздо лучшим способом лечения пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...