Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   $('input').on('focus', function() { $(this).is(':focus') }) - (https://javascript.ru/forum/jquery/29662-%24-%27input%27-%27focus%27-function-%7B-%24-%27-focus%27-%7D.html)

razerxxx 06.07.2012 15:04

$('input').on('focus', function() { $(this).is(':focus') }) -
 
$('input').on('focus', function() { 
    console.log($(this).is(':focus'));
}));

Вот такой вот код - везде кроме хрома работает ожидаемо. В хроме в консоль выводится false.
Одно из решений - сделать так:
$('input').on('focus', function() { 
    var it = this;
    setTimeout(function() {
        console.log($(it).is(':focus'));
    }, 100);
    
}));

Но это какой-то костыль получается... У кого есть какие идеи по этому поводу?

Deff 06.07.2012 16:04

razerxxx,
Объясните задачу и цель данного скрипта ?
Приведите полный код вместе с HTML и скриптом выполняющего вышеизложенную задачу, хотя бы не в хроме
как оформлять =>тут http://javascript.ru/formatting

razerxxx 06.07.2012 18:35

Ну скажем так, надо запускать некоторую функцию по определенным, условиям. Т.е например даны несколько полей input, при получении фокуса (focus), изменении данных (keypress) данные из поля input уходят на сервер. От сервера возвращается текст с ошибкой (если она имеется), и ошибка отображается во всплывающей подсказке. Но ошибка должна отобразиться только если поле в фокусе, если не в фокусе, то ошибка не отображается, а записывается в скрытый див и отобразится только если на поле снова будет наведен фокус.
<div class="field">
    <input name="username" />
    <div class="error"></div>
</div>
<div class="field">
    <input name="email" />
    <div class="error"></div>
</div>

var show_error = function(field) {
    var error = $(field).parent().find('.error');
    if ($(field).is(':focus')) {
        error.show();
    } else {
        error.hide();
    }
    
}
var set_error = function(field, error) {
    $(field).parent().find('.error').html(error);
    show_error(field);
}
$('.field input').on('keypress, change, blur', function() {
    var field = this;
    var action = $(this).attr('name');
    var value = $(this).val();
    $.get('http://some_url', {action: action, value: value}, function(error) {
        set_error(field, error);
    });
});
$('.field input').on('focus', function() {
    show_error(this);
});


Пока я набираю текст. Происходит отправка данных на сервер, и собственно возвращается ошибка. Но пока отправка идет, я могу перескочить на другое поле. Тогда полученную ошибку показывать не надо, а надо показать ошибку у другого поля (если она там уже есть, т.е. была занесена в div.error когда либо ранее).
Вобщем если совсем просто, при получении полем фокуса - отображаем ошибку для этого поля, при потере фокуса - скрываем. Но поскольку функция отображающая ошибку, запускается так же при дугих событиях, то в ней мы проверяем, $(field).is(':focus'). То есть в частном случае фактически и получается такая задача - которая работает не так как ожидается в хроме:
$('input').on('focus', function() { 
    console.log($(this).is(':focus'));
}));

Что интересно:
$('input').on('click', function() { 
    console.log($(this).is(':focus'));
}));

отрабатывает везде ожидаемо.

Deff 06.07.2012 18:41

razerxxx,
стандартная функци при изменении данных в любом элементе формы => onchange http://htmlbook.ru/html/attr/onchange

razerxxx 06.07.2012 18:53

И?? оно у меня используется: $('.field input').on('keypress, change, blur', function() { ...
Вроде это эквивалентно использованию onchange. Тем более onchnge не будет срабатывать пока форма не потеряет фокус, у меня обработка идет в том числе и по мере набора текста. Да и вопрос не об этом

Deff 06.07.2012 18:58

razerxxx,
В заголовке написано про input
onchange сработает при потере фокуса inputом -а иначе данные еще вводяцо
кроме $('.field input').on('change', function() { ...
думаю не нужно ничо ставить

лучше ставить обработчик на тег <input name="username" onchange="tst(this.value)"/>

function tst(val){...

}

razerxxx 06.07.2012 19:13

Мы немного не поняли друг, друга. Мне необходимо чтобы данные отправлялись еще при вводе слова, не только по onchange. Да и вопрос не про это, с отправкой данных проблем нет.

Ставить обработчик на тэг - как-то мне не очень нравятся такие идеи. Js код должен быть в js файле. Тем более у меня около 10 таких input-ов. На каждый ставить обработчик - както нерационально. Все же проще $('input').on('click', ...)

Deff 06.07.2012 19:19

razerxxx,
Цитата:

Сообщение от razerxxx
Мне необходимо чтобы данные отправлялись еще при вводе слова,

Если данные при вводе то
$('.field input').on('mouseout mousemove keydown keypress keyup',function(e) {


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