Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.04.2014, 10:14
Новичок на форуме
Отправить личное сообщение для rtfl Посмотреть профиль Найти все сообщения от rtfl
 
Регистрация: 07.04.2014
Сообщений: 1

settimeout pause/resume и mouseenter/mouseleave
Задача: есть карта с маркерами (leaflet), необходимо что бы при наведении мыши на маркер появлялся попап, а так же при перемещении мыши внутрь попапа он оставался открытым.
Концепция: при mouseleave с маркера или попапа вызывается функция закрытия попапа по таймауту. При mouseenter на маркер или попап ставится пауза таймера.
Реализация: Переопределил функцию закрытия попапа следующим образом:
closePopup: function (t) {
        t = t || 300;
        if (this._popup) {
            var ths = this;
           ths._timer = new Timer(function () {
                    ths._popup._close();
            }, t);
        }
        return this;
    },

где Timer:
function Timer(fn, countdown) {
    var ident, complete = false;

    function _time_diff(date1, date2) {
        return date2 ? date2 - date1 : new Date().getTime() - date1;
    }

    function pause() {
        clearTimeout(ident);
        total_time_run = _time_diff(start_time);
        complete = total_time_run >= countdown;
    }

    function resume() {
        ident = complete ? -1 : setTimeout(fn, countdown);
    }

    var start_time = new Date().getTime();
    ident = setTimeout(fn, countdown);

    return { pause: pause, resume: resume };
}

Проблема: 1. При быстром премещении мыши на маркерах может возникнуть ситуация, когда курсор установлен на маркере, но попап закрывается, хотя должен открыться. 2. Если открыть попап, а затем попробовать быстро переместить курсор вовне и обратно на попап, а затем опять вовне, то попап не закроется.

Код целиком: http://jsfiddle.net/xwreT/

Последний раз редактировалось rtfl, 07.04.2014 в 15:31.
Ответить с цитированием
  #2 (permalink)  
Старый 07.04.2014, 18:04
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Так я не понял, ваш _timer навешивается только при закрытии попапа? Так получается что при заходе на метку он будет неопределен.

UPDATE:
При быстром движении мышью с попапа и назад в _removePopups не срабатывает closePopup, следовательно таймер не обнуляется и при втором resume таймер на закрытие не запустится.

Последний раз редактировалось jsnb, 07.04.2014 в 19:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout как он работает??? namo86 Общие вопросы Javascript 16 02.02.2011 09:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 10:36