Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как сохранить фокус на элементе? (https://javascript.ru/forum/jquery/31234-kak-sokhranit-fokus-na-ehlemente.html)

SkaN 30.08.2012 22:20

Как сохранить фокус на элементе?
 
Вопрос сформулирован некорректно, но я не смог сжать проблему до одного предложения.
Суть в чем: по событию focusin на input под ним показыается элемент (список). По исчезновению фокуса из элемента список прячется. Из этого списка нужно выбрать что-нибудь. Но проблема такова: нажатие на список считается потерей фокуса у этого input'а и событие для члена списка даже не срабатывает, т.е. вернуть искусственно список обратно нельзя. Подскажите, пожалуйста, как можно не убирать фокус с элемента (или вернуть фокус обратно), если клик был по члену списка?
Вот весь код:
<label for="category1-name">Рубрика из первого списка: </label><input type="text" id="category1-name" name="category1-name" title="Выберите рубрику из первого списка" /><br />
<ul id="list1" name="list1">
    <li id="3">?????</li>
    <li id="16">Рубрика</li>
</ul>
<label for="category2-name">Рубрика из второго списка: </label><input type="text" id="category2-name" name="category2-name" title="Выберите рубрику из второго списка" /><br />
<ul id="list2" name="list2">
    <li id="13">????</li>
</ul>
<input type="hidden" id="category1" name="category1" /><input type="hidden" id="category2" name="category2" />

$(document).ready(function(){
    $("#category1-name").focus(function(){
        $("#list1").show();
    }).focusout(function(){
        $("#list1").hide();
    });
    
    $("#category2-name").focusin(function(){
        $("#list2").show();
    }).focusout(function(){
        $("#list2").hide();
    });
    
    $("#list1 li").click(function(){ alert("ololo");
        $("#category2-name").focus();
        var $name = $(this).text(),
            $id = $(this).attr("id");
            
        $("#list1 li").removeClass("selected");
            
        $("#category1-name").val($name);
        $("category1").val($id);
        alert($("category1").val());
    });
});

Deff 30.08.2012 22:45

Цитата:

Сообщение от SkaN
Суть в чем: по событию focusin на input под ним показыается элемент (список). По исчезновению фокуса из элемента список прячется.

Сделайте чтобы список показывался по фокусу - а исчезал по уборке кусора со списка через время t

SkaN 30.08.2012 22:52

Цитата:

Сообщение от Deff (Сообщение 201826)
а исчезал по уборке кусора со списка через время t

Это примерно так?
$("#list1, #list2"),mouseout(function(){
    setTimeout("$(this).hide()", t);
})

Aetae 30.08.2012 22:57

Может использовать label?

SkaN 30.08.2012 23:08

Цитата:

Сообщение от Aetae (Сообщение 201831)
Может использовать label?

а что с ним сделать в этой ситуации?

Deff 30.08.2012 23:11

$("#list1, #list2"),mouseleave(function(){
setTimeout("$(this).hide()", t);
})

SkaN 31.08.2012 01:28

Цитата:

Сообщение от Deff (Сообщение 201837)
$("#list1, #list2"),mouseleave(function(){
setTimeout("$(this).hide()", t);
})

Попробовал, с таким методом получается нехорошо, потому что при намеренной потере фокуса (переключение на другое поле) список остается...

Deff 31.08.2012 01:36

SkaN
Ну мне тяжело представлять -как у Вас организован процец
Можно сделать так - наверняка есть какое то внешнее обрамление этих обоих блоков... (Лан - это позже

Пока просто уберите setTimeout()

$("#list1, #list2"),mouseleave(function(){
$(this).hide();
})

LittlePony 31.08.2012 08:40

Цитата:

Сообщение от SkaN (Сообщение 201898)
Попробовал, с таким методом получается нехорошо, потому что при намеренной потере фокуса (переключение на другое поле) список остается...

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

SkaN 31.08.2012 10:22

Цитата:

Сообщение от LittlePony (Сообщение 201934)
Так можно и на потерю фокуса тоже реагировать. Просто создать флаг и проверять его. Если фокус потерян, но при этом мышь не над списком, то тогда действительно этот список скрывать. Можно и через таймаут скрывать через некоторое время, например если после потери фокуса мышь через полсекунды не над списком, значит этот список не нужен.

Неплохо! :) Спасибо


Часовой пояс GMT +3, время: 07:48.