2011-02-14 2 views
3

У меня есть следующий фрагмент кода для различения между щелчками и DoubleClick для:Отличить одного и двойной

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 
    var clicks; 
    $(element).observe('click', function (event) { 
     ++clicks; 
     if (clicks === 1) { 
      var timeoutCallback = function (event) { 
       if (clicks === 1) { 
        singleClickHandler.call(this, event); 
       } else { 
        doubleClickHandler.call(this, event); 
       } 
       clicks = 0; 
      }; 
      timeoutCallback.bind(this).delay(timeout/1000); 
     } 
    }.bind(this)); 
} 

Проблемы: событие не живет больше, когда обратный вызов задержки вызывается. Хотя он работает в Firefox, но это не в IE8. Объект события, переданный обработчикам кликов, является «мертвым», так как само событие уже передано.

У кого-нибудь есть совет, как решить эту проблему?

+1

Я бы этого не сделал, честно говоря. Надежность таймеров браузера настолько мала, что вы будете сбивать пользователей с ума. Интернет просто не делает двойной щелчок в целом. – Pointy

+0

Почему бы не использовать onclick и ondblclick? это объект, который его не поддерживает? http://msdn.microsoft.com/en-us/library/ms536921%28v=vs.85%29.aspx https://developer.mozilla.org/en/DOM/element.ondblclick – mplungjan

+3

@mplungian даже с этим подход необходимо добавить какой-то код таймера. Зачем? Потому что каждый «dblclick» будет * также * сначала запускать событие «click». Таким образом, ваш обработчик событий «клик» должен ждать, чтобы увидеть, происходит ли также «dblclick». Это беспорядок. – Pointy

ответ

1

Я знаю, что проект OpenLayers противостоит чему-то подобному. Посмотрите на строку 210 в этом файле: OpenLayers.Handler.Click sourcecode.

Я не знаю, как использовать это с рамками прототипа, но я надеюсь, что вы можете получить на правильном пути :)

Другое дело: было бы не лучше использовать событие MouseUp вместо щелчок?

3

Не только наблюдать событие щелчка, но и событие doubleclick.

$(element).observe('click',singleClickHandler); 
$(element).observe('dblclick',doubleClickHandler); 

Вот измененная версия после всех обсуждений:

var clicks;  
observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 

$(element).observe('click', function (event) { 
    ++clicks; 
    if (clicks === 1) { 
     var timeoutCallback = function (event) { 
      if (clicks === 1) { 
       singleClickHandler.call(this, event); 
      } else { 
       doubleClickHandler.call(this, event); 
      } 
      clicks = 0; 
     }; 
     timeoutCallback.bind(this, event).delay(timeout/1000); 
    } 
}.bind(this)); 

}

+0

Это вряд ли работает надежно, если вообще. [Здесь] (http://www.quirksmode.org/js/events_mouse.html#dblclick) является кратким абзацем из QuirksMode, например. – Pointy

+0

@Pointy: – kikito

+0

@Pointy Это неправда. 'dblclick' очень часто используется в prototypejs и работает во всех браузерах. Дайте мне конкретные примеры непоследовательного поведения или вообще не комментируйте – TurBas

0

Там есть идентификатор dblclick события на Prototype. Почему бы вам не использовать его?

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler) { 

    $(element).observe('click', function (event) { 
    singleClickHandler.call(this, event); 
    } 

    $(element).observe('dblclick', function (event) { 
    doubleClickHandler.call(this, event); 
    } 
} 
+1

, потому что singleClickHandler будет запущен при первом щелчке по двойному ключу – tyrondis

+0

В этом случае добавьте еще одну кнопку или ссылку. Если вы делаете разные вещи при нажатии и двойном щелчке, вы просто просите о проблемах. – kikito

Смежные вопросы