Показать сообщение отдельно
  #3 (permalink)  
Старый 06.07.2012, 18:35
Аватар для razerxxx
Аспирант
Отправить личное сообщение для razerxxx Посмотреть профиль Найти все сообщения от razerxxx
 
Регистрация: 05.10.2011
Сообщений: 85

Ну скажем так, надо запускать некоторую функцию по определенным, условиям. Т.е например даны несколько полей 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'));
}));

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

Последний раз редактировалось razerxxx, 06.07.2012 в 18:44.
Ответить с цитированием