Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Нужно определить в каком инпуте был фокус(мигал ку


Автор: BlackApricot 14.5.2010, 05:21
Нужно определить в каком инпуте был фокус(мигал курсор), чтобы потом вернуть его на место.
Использование библиотек не желательно. 
Но и не откажусь, если будет конкретно написано, как к ней обратиться, и что она вернёт. То есть реальный рабочий код, учитывая нулевые знания библиотек.

Автор: Amphiluke 14.5.2010, 08:08
Проще всего навязать всем нужным input'ам обработчик события onfocus, в который будет запоминать текущий элемент в фокусе.
Код

    <form action="#" id="aForm">
        <input type="text" /><br />
        <input type="text" /><br />
        <input type="text" /><br />
        <input type="text" /><br />
        <input type="text" /><br />
        <input type="button" value="return focus to the last focused input" onclick="focusedInput.focus();" />
    </form>
    <script type="text/javascript">
        var inputs = document.getElementById("aForm").getElementsByTagName("input");
        var focusedInput = inputs[0];
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].type.toLowerCase() == "text")
                inputs[i].onfocus = function() {focusedInput = this;}
        }
    </script>

Автор: BlackApricot 16.5.2010, 05:25
Amphiluke, спасибо, но как видишь, всё ещё проще.


Делаем глобальную переменную:
Код

var lastInput=null;

В нужных инпутах пишем:
Код

 ...onfocus(lastInput=this;)...

В нужных местах проверяем, и если нужно(или можно?), ставим курсор:
Код

if(lastInput!=null){lastInput.focus();};


При желании, или нужде, можно проверять:
а нужно ли в это конкретное поле ставить курсор?
а находится ли искомое поле в зоне видимости, не проскроленно ли это поле за пределы окна?
Думать нужно в каждом конкретном случае, и если нужно что-то делать, стоит эту проверку засунуть в отдельную функцию.

Автор: Amphiluke 16.5.2010, 09:44
Цитата(BlackApricot @  16.5.2010,  09:25 Найти цитируемый пост)
как видишь, всё ещё проще.

Не все то, что просто, есть одновременно и хорошо.
Ладно если у вас немного этих инпутов. В этом случае худшее, чего вы получите — это несолидное захламление HTML кода повторяющимися Javascript-овыми вставками. А если инпутов полсотни (пример, конечно, надуманный, но тем не менее)? Собственно, для этого-то и хороши методы динамического «навешивания» обработчиков. Лучше всего пользоваться методами addEventListener и attachEvent. При этом, кстати, благодаря доступности экземпляра объекта Event никаких проблем не возникнет при необходимости дополнительных проверок, какой инпут вызвал событие, находится ли он в зоне видимости и прочее. И код HTML остается чистым, и нет проблем с дублирующимся кодом Javascript, и код этот к тому же самоадаптирующийся к условиям, когда число инпутов может изменяться.

Автор: BlackApricot 17.5.2010, 13:32
Цитата(Amphiluke @  16.5.2010,  09:44 Найти цитируемый пост)
(пример, конечно, надуманный, но тем не менее)

Не вижу ни чего надуманного.

Цитата(Amphiluke @  16.5.2010,  09:44 Найти цитируемый пост)
это несолидное захламление HTML кода повторяющимися Javascript-овыми вставками

Вот это захламление?????
Код
...onfocus(lastInput=this;)...

Кстати, эта проверка единственная, она засунута в функцию, и у меня с этим нет проблем, и эта функция получает объект, какие тут проблемы с получением всех необходимых данных об этом объекте.

Цитата(Amphiluke @  16.5.2010,  09:44 Найти цитируемый пост)
И код HTML остается чистым, и нет проблем с дублирующимся кодом Javascript, и код этот к тому же самоадаптирующийся к условиям, когда число инпутов может изменяться.

Не знаю, не знаю, у меня с количеством инпутов, проблем нет. Я принципиально не пишу код, который сам не разберётся с количеством своих элементов, прибавилось, убавилось...


И ни кто не спорит, что этот простой вариант универсален.
А в моём конкретном случае, твой вариант, есть излишество, реально есть 4 поля и 2 кнопки, после обработки кнопок захотелось вернуть курсор на место, чтобы не щёлкать лишний раз мышью, и всё. В предыдущей версии этого не было, и рука не отвалилась.


Ещё раз спасибо.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)