Microsoft Edge: событие onclick перестает работать?
У меня странные проблемы с моим (ASP.NET) веб-приложением в Microsoft Edge.
В какой-то момент событие onclick
перестает работать. Все кнопки на странице, которые реагируют на событие onclick
, перестают работать. На той же странице есть несколько кнопок, которые реагируют на событие onmousedown
, и они продолжают работать.
Если я обновляю страницу, проблема исчезнет. В консоли нет ошибок.
У меня нет этой проблемы с другими браузерами (включая IE11 под Windows 10).
У вас возникли подобные проблемы?
Ответы
Ответ 1
Это ошибка в Edge.
Что я нашел, так это то, что оно связано с появлением дочернего окна и перестановкой (или модификацией) tr в таблице.
https://connect.microsoft.com/IE/feedback/details/2109810/browser-stops-registering-click-events-on-table
Чтобы исправить это, вам нужно заставить таблицу перерисовать. Вы можете сделать это, установив отображение: none перед изменением таблицы, а затем установив отображение: previousValue после его изменения.
Надеюсь, что это поможет.
Ответ 2
Это не полный ответ, так как он не учитывает, почему события click
не работают, но я чувствую, что он принадлежит здесь, так как мы с моей командой безнадежно застряли, пытаясь найти ответ на этот вопрос. Кажется, это ошибка в Edge, и каждый обходной путь, который мы пробовали, не удался, пока я не наткнулся на комментарий @Come выше.
Решение заключалось в том, чтобы изменить все наши события click
на события mouseup
, эмулируя одно и то же поведение. По какой-то причине mouseup
был запущен, даже когда click
не был. mousedown
работает, но mouseup
более эмулирует click
.
var listenType = (navigator.userAgent.toLowerCase().indexOf('edge') != -1) ? 'mouseup' : 'click';
// ...
$("#my_element").on(listenType, function()
{
// ...
}
Надеюсь, это поможет кому-то!
Ответ 3
Мое решение состояло в том, чтобы создать "скрытый" элемент ввода и вызвать фокус на нем, который волшебным образом возвращает клики.
Ответ 4
В моем случае удаление дочерних элементов приводит к этой проблеме.
Поэтому, когда я удаляю элемент (включая замену DOM на innerHTML), я делаю style.display = "none"
для элемента перед удалением.
Это решает проблему.
Например, я использую эту функцию
function removeComponent(selector) {
$(selector).css("display", "none");
return $(selector).detach();
}
вместо
function removeComponent(selector) {
return $(selector).detach();
}