Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проверка актуальности события (https://javascript.ru/forum/jquery/7929-proverka-aktualnosti-sobytiya.html)

qwerty 26.02.2010 19:33

Проверка актуальности события
 
Имеется страница со ссылками.
При mouseover() ajax'ом (средствами jQuery) подгружается и выводится громоздкий тултип (всплывающая подсказка).
При mouseout() - исчезает.

На практике получается, что если пользователь к моменту окончания загрузки тултипа уже увел курсор со ссылки, тултип висит и mouseout() не срабатывает.

Подскажите пожалуйста, как на момент окончания работы ajax'a проверить, актуально ли еще событие mouseover() ? Ну или, на худой конец, прервать загрузку при срабатывании mouseout(). Желательно в кодах jQuery. Или тут средствами jQuery не обойтись и придется в чистом JS обработку XMLHttpRequest расписывать ?

micscr 27.02.2010 09:09

Может не стоит на события мыши завязывать ajax? А передать все подсказки например как данные в js.

Но если все таки надо, то просто надо засекать событие mouseout и mouseover на элементе и соответственно реагировать. Что то типа:

$('a').mouseout(function(){
    $(this).data('whereMouse', 'out');
}).mouseover(function(){
    $(this).data('whereMouse', 'over');
});

//И там где должна сформироваться подсказка:
if ($(this).data('whereMouse') == 'over') {
    // выводим подсказку
}

qwerty 02.03.2010 22:53

Хм, вариант с data() как-то даже не рассматривался.

Огромное спасибо.
Работает !

nextdrift 23.10.2011 20:00

Вроде то, что мне нужно... Подскажите, как лучше организовать одну вещь...
При наведении курсора мыши, подгружается информация. Но это жутко раздражает, потому что она постоянно мешается...
Как сделать так, чтобы $.ajax выполнялся через некоторое время.
Значит вот код
$('img[uid]').live('mouseover',function () {
        uid = $(this).attr('uid');
        $.ajax({
            
            тут код аякса
 
        });
});


так так... Чуть поэкспериментировал и вроде заработало. Сделал правда чуть иначе.
Вот вид моего кода (может его можно улучшить?)

$('img[uid]').live('mouseover',function () {
        uid = $(this).attr('uid');
        whereMouse = 'over';
        $('img[uid="' + uid + '"]').live('mouseout', function(){ // с $(this) не пашет
            whereMouse = 'out';
        });

        setTimeout(function(){
            if(whereMouse == 'over') {
                $.ajax({
                            код

                });
            }
        }, 400);
});


live использую, т.к. информация постоянно подгружается

nextdrift 23.10.2011 22:08

короче потестировал я свой код... Есть небольшой баг, который хотелось бы исправить. Весь вечер голову уже ломаю.........

Из-за того, что стоит таймаут, несколько событий могут запуститься одновременно. Стоит мышкой быстро провести по всем элементам и остановиться на последнем, так создается эффект мерцания на последнем. Вот чуть более полный код

$('img[uid]').live('mouseover',function () {
              
        uid = $(this).attr('uid');
        whereMouse = 'over';
        $('img[uid="' + uid + '"]').live('mouseout', function(){
            whereMouse = 'out';
        });

        setTimeout(function(){


            $('#infobar').remove(); // удаляем, если есть. На всякий пожарный

            if(whereMouse == 'over') {

                $.ajax({

                    url: local + 'ajax/json/info_u' + uid + '.json',
                    dataType: 'json',
                    success: function(json) {

                            ------------------
                            заполняем переменную infobar
                            ------------------
                            $('#track_controls').append(infobar);
                            $("#infobar").fadeIn(300);
                            
                            $('img[uid=' + uid + ']').live('mouseout',function(){
                                $("#infobar").fadeOut(300, function(){
                                    $(this).remove();
                                });
                            });
                    }
                });
            }
        }, 400);
});



подскажите, что можно сделать?

nextdrift 24.10.2011 01:44

Всё. Нашёл решение ^_^ Просто очищаю таймер. Вот код

var timer;

$('img[uid]').live('mouseover',function () {
        uid = $(this).attr('uid');
        whereMouse = 'over';
        $('img[uid="' + uid + '"]').live('mouseout', function(){
            whereMouse = 'out';
        });
        if(timer) { // чистим таймер ------ это и есть решение
            clearTimeout(timer); 
            timer = null 
        }
        timer = setTimeout(function(){

            $('#infobar').remove(); // удаляем, если есть. На всякий пожарный

            if(whereMouse == 'over') {

                $.ajax({

                    url: local + 'ajax/json/info_u' + uid + '.json',
                    dataType: 'json',
                    success: function(json) {
                            
                            infobar = 'ЗАПОЛНЯЕМ';

                            //alert(infobar);
                            $('#track_controls').append(infobar);
                            $("#infobar").fadeIn(300);
                            
                            $('img[uid=' + uid + ']').live('mouseout',function(){
                                $("#infobar").fadeOut(300, function(){
                                    $(this).remove();
                                });
                            });
                    }
                });
                
            }
        }, 400);
});


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