Webkit: contextmenu / click处理bug的解决方案

Webkit: contextmenu / click handling bug workaround?

本文关键字:bug 解决方案 处理 click contextmenu Webkit      更新时间:2023-09-26

我正在尝试使用contextmenu &以跨浏览器的方式单击锚元素上的处理程序,这被证明是非常困难的。

这里的问题是:如果preventDefault()被上下文菜单事件从上下文菜单事件处理程序调用,浏览器的行为不同。所有浏览器都不会正确显示其浏览器的默认上下文菜单。在Chrome &;但是,Safari浏览器会遵循元素的单击事件(并且仅在取消contextmenu事件的情况下)。

当我从上下文菜单处理程序中取消上下文菜单事件时,我不希望在同一元素上触发连续的单击事件。有没有干净利落的办法来解决这个问题?无论在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);
    }

通过使用其他元素(例如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