Я пытаюсь работать с контекстным меню и обработчиками щелчков на элементе привязки кросс-браузерным способом, и это оказывается действительно трудным.
Вот проблема: если preventDefault()
вызывается для события contextmenu из обработчика события contextmenu, браузеры ведут себя по-разному. Все браузеры правильно не отображают контекстное меню своего браузера по умолчанию. Однако в Chrome & Safari браузер отслеживает событие щелчка для элемента (и только если событие contextmenu отменяется).
Когда я отменяю событие contextmenu из обработчика contextmenu, я НЕ хочу, чтобы событие с последовательным щелчком срабатывало для того же элемента. Есть ли чистый способ решить эту проблему? Ни возвращение false в обработчике contextmenu, ни вызывающая функция stopPropagation не устраняют проблему!
Здесь - это демонстрация со странным глюком (используйте инспектор Webkit или Firebug, чтобы увидеть след)
Вот один из ответов: используйте jQuery, а не POJ для очистки данных о ширине / высоте:
function Cancel_Next_Click()
{
// Compatibility - Chrome & Safari bug where context click event is followed by an undesired click event
var Cancel_Next_Click_Element = document.createElement("div");
Cancel_Next_Click_Element.style.position = "fixed";
Cancel_Next_Click_Element.style.left = "0px";
Cancel_Next_Click_Element.style.top = "0px";
Cancel_Next_Click_Element.style.width = window.innerWidth;
Cancel_Next_Click_Element.style.height =window.innerHeight;
document.body.appendChild(Cancel_Next_Click_Element);
var Cancel_Next_Click_Element_Listener = function() {
document.body.removeChild(Cancel_Next_Click_Element);
document.removeEventListener('mouseup', Cancel_Next_Click_Element_Listener, false);
}
document.addEventListener('mouseup', Cancel_Next_Click_Element_Listener, false);
}