Ваше требование кажется противоречивым: вы не можете «сохранять фокус» на одном входе и одновременно позволять пользователям нажимать на другие входы.
Более распространенным методом проверки является 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 или если для него задан ключ, соответствующий соответствующей значение ложное. То есть, если оно никогда ранее не проверялось или прошло в последний раз, оно прошло.
(Кстати, вы должны смотреть в проверяющий формат с помощью регулярных выражений, а не сравнивать вручную положение первого "@" с последним ".".)