2016-08-05 3 views
0

Я унаследовал код JavaScript, который реализует мягкую клавиатуру с настраиваемым классом Keyboard с несколькими prototype методами - как настраиваемыми методами, так и методами, которые, по-видимому, переопределяют некоторые значения по умолчанию. (Первое признание в том, что я не очень опытный с JavaScript, и только обезжиренными несколько ссылок на prototype подход.)prototype.onНажмите стрельбу 3 раза с двойным щелчком

The prototype методов определяются как это, и это специфический метод не делать то, что я ожидал :

Keyboard.prototype.onClick = function(keyImageElement) { 
    keyImageElement = window.event.srcElement; 
    var keyboard = keyImageElement.keyboard; 

    // Make sure that the srcElement is a key image element 
    if (keyboard !== undefined) { 
     if (!keyImageElement.disabled) 
     { 
      Keyboard.setOpacity(keyImageElement, .70); 
      var resetFilter = function() { 
       Keyboard.setOpacity(keyImageElement, 1); 
      }; 
      setTimeout(resetFilter, 200); 

      keyboard.updateInputField(keyImageElement.name); 
     } 
    } 
}; 

(Да, я знаю, что это использует IE-специфические механизмы, это для IE на основе встроенного браузера Однако, я также дублируется такое же поведение проходящее e и используя e.target в Firefox.).

Клавиатура создает DOM div, и добавляет к нему элемент DOM span для каждого ключа, из которого есть пара дюжины.

В режимах IE 7 и 8 это работает правильно. Неважно, как быстро я нажимаю, я получаю только одно событие за клик. Но в IE> = 9 и в Firefox 48, если я дважды щелкнул, достаточно быстро (предположительно, чтобы зарегистрироваться как двойной щелчок, но на самом деле он не должен быть очень быстрым), я получаю 3 события, а не 2.

Я попытался eventstopPropagation(), preventDefault() и stopImmediatePropagation() методы, но те, которые не изменили поведение.

Я предполагаю, что некоторые основные изменения в браузере/JavaScript/стандартах несут ответственность за это различное поведение, но я не знаю, что конкретно, или как его решить.

Помимо всего прочего, я, похоже, не могу аналогичным образом переопределить некоторые другие методы событий onXxx(). Фактически, исходный код имеет методы Keyboard.prototype.onMouseDown() и onMouseUp(), но, оказывается, они не запускаются вообще, даже в старых режимах IE.

Edit: Поскольку это ясно, что даже двойной щелчок называют onClick(), я попытался с помощью detail элемента, чтобы определить, тогда это, и игнорировать «лишний» вызов для двойного щелчка, но получается из:

  1. Firefox видит счетчик 1, 2, 2. Я ожидал, и в расчете на 1, 1, 2
  2. IE, кажется, не поддерживает это вообще, видя 0, 0, 0
+0

Meta: Меня также интересуют любые мысли о том, почему я не нахожу примеров обработки событий с помощью методов «прототипа», подобных этому. – dbreaux

+0

Кстати, только в режиме IE 11 Edge значения деталей были равны нулю. Это похоже на ошибку. В 9 и 10 режимах они составляли 1,2,2. В 7 или 8 режимах этого свойства вообще не существует. – dbreaux

ответ

0

ОК, Я рассмотрел мою ближайшую проблему. Я могу проверить поле type для 'click' vs. 'dblclick'.

Примечание:

  • IE> = 9 (и Firefox) отправляет щелк, щелк, DblClick
  • IE < 9 посылает щелчок, DblClick

(Тем не менее хотелось бы видеть хорошее ссылка на использование методов прототипа для переопределения обработки событий.)

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