Я унаследовал код 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.
Я попытался event
stopPropagation()
, preventDefault()
и stopImmediatePropagation()
методы, но те, которые не изменили поведение.
Я предполагаю, что некоторые основные изменения в браузере/JavaScript/стандартах несут ответственность за это различное поведение, но я не знаю, что конкретно, или как его решить.
Помимо всего прочего, я, похоже, не могу аналогичным образом переопределить некоторые другие методы событий onXxx()
. Фактически, исходный код имеет методы Keyboard.prototype.onMouseDown()
и onMouseUp()
, но, оказывается, они не запускаются вообще, даже в старых режимах IE.
Edit: Поскольку это ясно, что даже двойной щелчок называют onClick()
, я попытался с помощью detail
элемента, чтобы определить, тогда это, и игнорировать «лишний» вызов для двойного щелчка, но получается из:
- Firefox видит счетчик 1, 2, 2. Я ожидал, и в расчете на 1, 1, 2
- IE, кажется, не поддерживает это вообще, видя 0, 0, 0
Meta: Меня также интересуют любые мысли о том, почему я не нахожу примеров обработки событий с помощью методов «прототипа», подобных этому. – dbreaux
Кстати, только в режиме IE 11 Edge значения деталей были равны нулю. Это похоже на ошибку. В 9 и 10 режимах они составляли 1,2,2. В 7 или 8 режимах этого свойства вообще не существует. – dbreaux