Нажатие Escape под Firefox убивает мои запросы Ajax.Я хотел бы предотвратить это - PullRequest
9 голосов
/ 07 октября 2010

Я занимаюсь разработкой веб-приложения, которое требует длительных запросов Ajax. К сожалению, в Firefox нажатие клавиши Escape во время запроса имеет недостаток, заключающийся в уничтожении запроса и любой хранящейся в нем информации. Это довольно раздражает, так как это может привести к всевозможным неприятным осложнениям, если это произойдет в неподходящее время. Поэтому я хотел бы отключить эту функцию.

Мой первый рефлекс состоял в том, чтобы перехватывать нажатия клавиш на границах , чтобы гарантировать, что они не достигнут окна. Для этой цели я установил обработчик событий [keypress], только для событий, чей [keyChar] равен 27, и заставил его вызывать [stopPropagation] и [protectDefault]. И какое-то время казалось, что это работает.

Затем я понял, что это не сработает, когда пользователь нигде не щелкнет в окне, поскольку обработчики событий никогда не получали событие. Я попытался прикрепить свой обработчик к или безрезультатно, поэтому в итоге я добавил обработчик события [load] и заставил его принудительно сфокусироваться на . И какое-то время казалось, что это работает.

Затем я понял, что когда пользователь по какой-то причине редактировал , снова, обработчик событий , или , похоже, никогда не получал событие. Итак, я добавил еще один обработчик [нажатия клавиш], перехватывающий с [protectDefault] на , когда [keyChar] равен 27.

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

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

Если это не то, что вы можете изменить (или даже можете), вы должны посмотреть, почему ваши запросы не являются отказоустойчивыми. Есть ли способ поместить сообщение в транзакции и откатить последний, если соединение прервано?

1 голос
/ 06 января 2013

Я знаю, что это старая ветка, но в Mozilla есть активная ошибка, связанная с этой проблемой (с которой я также сталкиваюсь). См. https://bugzilla.mozilla.org/show_bug.cgi?id=614304 для получения дополнительной информации.

Одним из предложений по этой ошибке является перехват и предотвращение нажатия клавиши ESC на уровне окна (как также упоминается в OP):

window.addEventListener('keydown', function(e) {(e.keyCode == 27 && e.preventDefault())});

Это может иметь нежелательные побочные эффекты.

...