Webkit: контекстное меню/обработка ошибок при обработке кликов?

Я пытаюсь работать с контекстным меню и обработчиками кликов на якорном элементе в кросс-браузерном режиме, и это оказывается очень сложно.

Вот проблема: если preventDefault() вызывается для события contextmenu из обработчика событий contextmenu, браузеры ведут себя по-разному. Все браузеры правильно не отображают контекстное меню своего браузера по умолчанию. Однако в Chrome и Safari браузер следует за событием click для элемента (и только в том случае, если событие contextmenu отменено).

Когда я отменяю событие контекстного меню из обработчика контекстного меню, я НЕ хочу, чтобы последовательное событие щелчка запускалось для одного и того же элемента. Есть ли чистый способ решить эту проблему? Ни возврат false в обработчике контекстного меню, ни вызов функции 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);
    }

person Kunal Gupta Amc    schedule 08.12.2011    source источник
comment
Вы должны использовать POJ? или вы могли бы использовать jquery или какой-либо другой фреймворк? при этом вы можете использовать что-то другое, кроме тега a, для выполнения этого   -  person Eonasdan    schedule 09.12.2011
comment
Если jquery или любой другой фреймворк решит эту проблему, мне было бы очень интересно узнать! Я пробовал связывать события в jQuery всеми устаревшими и новыми способами, которые он предлагает, но все они не устраняют то, что я считаю ошибкой WebKit.   -  person Kunal Gupta Amc    schedule 09.12.2011
comment
В настоящее время самым чистым и универсальным способом решения этой проблемы может быть создание эфемерного перехватывающего элемента в обработчике контекстного меню, который аннулирует щелчок, но я надеялся, что будет более чистое решение!   -  person Kunal Gupta Amc    schedule 09.12.2011


Ответы (1)


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

http://abeautifulsite.net/blog/2008/09/jquery-context-menu-plugin/

http://beckelman.net/post/2008/11/04/Right-or-Left-Click-Context-Menu-Using-jQuery-Demo.aspx

person Eonasdan    schedule 09.12.2011
comment
Спасибо! - 1) плагин контекстного меню jquery фактически вообще не отображает контекстное меню в Chrome. (Работает в Firefox!) - person Kunal Gupta Amc; 10.12.2011
comment
2) демонстрация контекстного меню правой или левой кнопкой мыши также не работает в Chrome/Safari! (Работает в Firefox!) - person Kunal Gupta Amc; 10.12.2011
comment
В случае, если вам нужен href, например, для отображения URL-адреса в строке состояния браузера, совместимости между браузерами и роботами и т. д., у вас нет другого выбора, кроме как использовать тег привязки. это тяжело! - person Kunal Gupta Amc; 10.12.2011
comment
Я только что попробовал обе их демонстрационные страницы в Chrome и IE9, и обе работали нормально. - person Eonasdan; 10.12.2011
comment
Эонасдан, это может быть ошибка Mac! - person Kunal Gupta Amc; 10.12.2011