Подтвердить что ты не робот

JQuery Фокус на поле ввода

HTML на странице имеет 20 <input> полей, каждый из которых именован и задан ID в порядке возрастания от 1 до 20.

Если переменная id установлена ​​на следующий последовательный id (id + 1), эта функция заставит фокус применить к этому полю. Однако при нажатии за пределами текущего поля ввода последнее поле ввода не восстанавливает фокус, если введенный номер больше 10, но будет отображаться предупреждение.

$(":input").focusout(function(){
    var input = $(this).val();
    var id    = $(this).attr('id');
    if(input > 10){ 
        alert('You must enter a number between 0 and 10 '+id);
        $("#"+id).select();
    }
});

Как установить последнее поле ввода для восстановления фокуса?

4b9b3361

Ответ 1

Попробуйте заменить:

$("#"+id).select();

С

$(this).focus();

В этом случае $("#"+id) и $(this) являются одним и тем же элементом, и я предполагаю, что вы хотите focus элемент при возникновении ошибки.

Кроме того: я не считаю, что значения id или name могут легально начинаться с числа, вы можете прикрепить их к чему-то вроде option1, option2 и т.д. Это может сработать, но это может также вызвать проблемы, которые трудно отлаживать. Лучше всего ошибаться на стороне осторожности и лучших практик.

Каковы допустимые значения для атрибута id в HTML?

Изменить: после того, как вы не получили focus(), я попытался с setTimeout и смог это сделать. Я не уверен, почему, или если это действительно необходимо, но, похоже, это работает.

$(":input").focusout(function(){
    var $this = $(this),
        input = $this.val();

    if (input > 10){
        alert('You must enter a number between 0 and 10');
        setTimeout(function(){
        $this.focus();
        }, 1); 
    }
}); 

Мне бы хотелось услышать, есть ли лучший способ сделать это или объяснение. Я подозреваю, что события размытия и фокуса не срабатывают в порядке, который делает возможным предыдущий метод?

Демо: http://jsfiddle.net/zRWV4/1/

Как уже упоминалось в комментариях, вы должны в конечном итоге убедиться, что значение представляет собой целое число с parseInt или подобное (похоже, вы уже знаете об этом).

Ответ 2

заменить

$("#"+id).select();

по

$("#"+id).focus();

или даже

$(this).focus();

Ответ 3

(Попробуйте использовать .blur() вместо .focusout(). Но это, вероятно, не поможет)

Попробуйте удалить alert() некоторое время - иногда это может вызвать проблемы с фокусом...

Ответ 4

Вы должны проанализировать текст внутри ввода, чтобы сравнить его с числом. var input = parseInt($(this).val());

   $(":input").blur(function(){
        var input = parseInt($(this).val());
        var id    = $(this).attr('id');
        if(input > 10){ 
            alert('You must enter a number between 0 and 10 '+id);
            $("#"+id).select();
        }
    });

Ответ 5

Пример jsFiddle

Это мой код, я объясню, что я изменил:

$('input[id^="input"]').focusout(function(){
    var selected = parseInt($(this).val(), 10);
    if (selected <= 10) {
        $("#input-"+selected).focus();
    }
    else {
        alert('Invalid Argument! 1-10 only!');
        $(this).focus();
    }
});
  • Я использую focus() вместо select(), который не будет работать.
  • Вы путаете id с select, который заставил вас всегда попробовать и выбрать $("#input-IDOFSELECTIONINPUT") вместо $("#input-IDOFWANTEDINPUT")
  • В вашем коде, хотя предупреждение было бы сброшено, остальная часть кода продолжалась бы нормально. Это не будет в моем коде.
  • Вы поставили желаемый результат ($("#"+id).select();) в нежелательном состоянии (input > 10), что практически никогда не давало ему шанса.
  • И последнее, но не менее важное: я дал входы более эффективный (и действительный) идентификатор. Идентификаторы не должны начинаться с числа.