возможность сфокусироваться, но не вводить поле ввода с помощью jquery

В основном у меня есть ряд 5 строк текстовых полей (каждая строка содержит 3 столбца) и одна текстовая область... вкладка в конце столбца 3 должна привести ее к текстовой области, а затем вкладка из текстовой области должна привести меня к следующая строка полей ввода/текста.

приведенный ниже код работает до степени табуляции через row1, переводя меня с row1 col3 на textarea_desc, а затем табуляция на textarea_desc смещает фокус на row2 col1, однако я не вижу, чтобы курсор отображался на row2 col1... если я добавил css, он hsows вверх в row2 col1, но курсора нет, поэтому я не могу вводить текст, мне нужно нажать на row2 col1, чтобы появился курсор, может кто-нибудь сказать мне, почему?

 $('input[type="text"],textarea').on('focusout',  function() {
        var box_class=$(this).attr("class");
        var row_id=$(this).parents('ul').attr('id');    


        if (box_class.indexOf("col3")>=0) {
            $("#textarea_desc").focus();
            $("#prev_row").val(row_id);
        }
        if (box_class.indexOf("textarea_desc")>=0) {
            var prev_row=$("#prev_row").val();

            var new_row=$("#prev_row").val().match(/\d+/);
            new_row="#row"+(parseInt(new_row)+1)+"-col1";


            $(new_row).focus();


        }

    });

хтм....

 <ul id="row1" class="row">
                    <li class="col1" >1.</li>
                    <li class="col2"><input type="text" size="26" class="row1-col1" id="row1-col1" /></li>
                    <li class="col3"><textarea cols="28" rows="1"  class="row1-col2  textareainp" id="row1-col2" ></textarea></li>
                    <li class="col4"><input type="text" size="10" class="row1-col3 " id="row1-col3" /></li>
                </ul><ul id="row2" class="row">
                    <li class="col1" >2.</li>
                    <li class="col2"><input type="text" size="26" class="row2-col1" id="row2-col1" /></li>
                    <li class="col3"><textarea cols="28" rows="1"  class="row2-col2  textareainp" id="row2-col2" ></textarea></li>
                    <li class="col4"><input type="text" size="10" class="row2-col3 " id="row2-col3" /></li>
                </ul>
<textarea cols="40" rows="7"  class="textarea_desc" id="textarea_desc" ></textarea>
<input type="hidden" id="prev_row" class="prev_row" value="" />

person NMF SDF    schedule 17.01.2013    source источник
comment
Вы устанавливаете tabindex для элементов?   -  person ATOzTOA    schedule 17.01.2013
comment
Нет. но я могу перейти от row1 col1 к row1 col3 в текстовую область, а не обратно из текстовой области в строку col1 (я могу добавить значение в row2.col1 $(new_row).focus().val('hello' ); и он отображается в текстовом поле ....   -  person NMF SDF    schedule 17.01.2013


Ответы (1)


Это связано с тем, что focusout происходит из-за события TAB, а событие TAB автоматически переводит фокус на следующий элемент. Вам нужно будет поймать ключ TAB, а затем использовать что-то вроде этого:

$("*:focus")

Это даст вам текущий сфокусированный элемент. Используйте это в своей функции.

Кроме того, вам нужно вызвать это:

event.preventDefault()

Рабочий код:

$(document).on("keydown", function(event) {
    switch (event.keyCode) {
        case 9: // TAB
            event.preventDefault(); // Stop from changing focus

            $this = $("*:focus");

            var box_class=$this.attr("class");
            var row_id=$this.parents('ul').attr('id');    

            if (box_class.indexOf("col3")>=0) {
                $("#textarea_desc").focus();
                $("#prev_row").val(row_id);
            }
            if (box_class.indexOf("textarea_desc")>=0) {
                var prev_row=$("#prev_row").val();

                var new_row=$("#prev_row").val().match(/\d+/);
                new_row="#row"+(parseInt(new_row)+1)+"-col1";


                $(new_row).focus();
            }
            break;
    }
});
person ATOzTOA    schedule 17.01.2013
comment
cheked... но теперь я не могу перейти от col1 к col2 или col3 (вкладка), но col3 к текстовой области и текстовой области к строке 2 работает... - person NMF SDF; 17.01.2013
comment
Итак, у вас все еще есть проблемы? - person ATOzTOA; 17.01.2013
comment
хорошо, я добавил перемещение col1 в col2 и col2 в col3 ... приму ваш ответ - person NMF SDF; 17.01.2013
comment
нет, не совсем... просто чего-то не хватает if (box_class.indexOf(col2)›=0) { var new_row1=#+row_id+-col3; $(новая_строка1).фокус(); } if (box_class.indexOf(col3)›=0) { var new_row2=#+row_id+-col4; $(новая_строка2).фокус(); } - person NMF SDF; 17.01.2013
comment
только один вопрос: .... если я динамически генерирую текстовые поля, $ (*: focus), похоже, не работает ... любой обходной путь для этого ... - person NMF SDF; 18.01.2013
comment
Затем вам нужно будет сохранить текущий сфокусированный элемент в переменной jquery для последующего использования. Вы можете делать это всякий раз, когда звоните focus(). - person ATOzTOA; 18.01.2013
comment
эй, просто хотел связаться и задать вам вопрос ... код, который вы дали, работает нормально. Я значительно расширил его... однако я столкнулся с проблемой, и это действительно странно... если изменить поле ввода row1col1, вызывается функция, чтобы проверить, соответствует ли старое значение новому, если не выполняется вызов ajx (checkval функция ...) после вызова ajax фокус должен переместиться на текстовое поле row1col2... самое смешное, что он ненадолго фокусируется на текстовом поле row1col2 и переходит к row1col3 (поле ввода).... я не могу понять это вне. он работает в ie и chrome.. jsfiddle.net/2tBvP - person NMF SDF; 23.01.2013
comment
но не в firefox .. заметьте, если я не делаю вызов ajax, он отлично работает, это вызов ajax, который заставляет его прыгать по текстовой области - person NMF SDF; 23.01.2013
comment
Вы вызываете код для изменения фокуса внутри обработчика success AJAX? - person ATOzTOA; 23.01.2013
comment
нет извне.. но я пытался изменить фокус в строке успеха 99, строке 100 в jsfidde - person NMF SDF; 23.01.2013
comment
в основном посмотрите на строку 175,176,179 - person NMF SDF; 23.01.2013