Как сохранить фокусировку на проверке текстового поля, не блокируя другие текстовые поля? - PullRequest
0 голосов
/ 27 сентября 2011

Вот пример метода проверки, который я использую:

 if(currentFieldCategory=='e')
    {
        var atpos=currentFieldValue.indexOf("@");
        var dotpos=currentFieldValue.lastIndexOf(".");
        if (atpos<1 || dotpos<atpos+2 || dotpos+2>=currentFieldValue.length) 
        {
            echo('Please enter a valid email address');
    currentField.focus();   
            return 'Please enter a valid email address';
        } 
    }

Если пользователь не введет действительное электронное письмо, появится сообщение об ошибке.Использование currentField.focus ();фокус остается на проверяемом текущем текстовом поле, но все остальные текстовые поля блокируются до тех пор, пока не будут введены правильные данные.

Мне интересно, есть ли способ сохранить фокус на текущем текстовом поле без блокировкидругие текстовые поля (т.е. пользователь все еще может щелкнуть в других текстовых полях).Поскольку моя проверка работает как при вводе пользователя, так и при отправке формы, пользователи могут нажимать другие текстовые поля, даже если текущее текстовое поле не содержит правильных данных.

Может ли кто-нибудь помочь с этим?

Спасибо,

Ник

1 Ответ

0 голосов
/ 27 сентября 2011

Ваше требование кажется противоречивым: вы не можете «сохранять фокус» на одном входе и одновременно позволять пользователям нажимать на другие входы.

Более распространенным методом проверки является onchange или onblur, если конкретное поле не проходит проверку, установите его фон в другой цвет и / или отобразите сообщение об ошибке рядом с ним или что-то еще. Затем пользователь знает, к каким полям он должен вернуться, но он все еще может сначала ввести другие поля.

Сказав это, если вы действительно увлечены идеей фокусировки, возможно, вы сможете установить фокус только в первый раз, когда пользователь пытается покинуть поле. Если они попытаются снова покинуть поле, разрешите это.

// global (or at least a higher scope variable) to keep track of which
// fields have failed; I assume your fields all have IDs set
var invalidFields = {};


// within your validation function
if(currentFieldCategory=='e')
{
   var atpos=currentFieldValue.indexOf("@");
   var dotpos=currentFieldValue.lastIndexOf(".");
   if (atpos<1 || dotpos<atpos+2 || dotpos+2>=currentFieldValue.length) 
   {
      echo('Please enter a valid email address');
      // NEW IF TEST
      // only set focus if this field didn't already fail validation
      if (!invalidFields[currentField.id]) {
        invalidFields[currentField.id] = true;
        currentField.focus();
      }
      return 'Please enter a valid email address';
   }
   invalidFields[currentField.id] = false;
}

Примечание: выражение в новом тесте if, !invalidFields[currentField.id], будет истинным, если для invalidFields не определен (пока) ключ для идентификатора currentField или если для него задан ключ, соответствующий соответствующей значение ложное. То есть, если оно никогда ранее не проверялось или прошло в последний раз, оно прошло.

(Кстати, вы должны смотреть в проверяющий формат с помощью регулярных выражений, а не сравнивать вручную положение первого "@" с последним ".".)

...