Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery中的多事件处理问题_Javascript_Jquery_Events_Javascript Events - Fatal编程技术网

Javascript JQuery中的多事件处理问题

Javascript JQuery中的多事件处理问题,javascript,jquery,events,javascript-events,Javascript,Jquery,Events,Javascript Events,我对多个事件处理程序有一个奇怪的jquery问题。我试图实现的是: 用户在页面上选择一些文本 如果所选内容不为空-显示关联菜单 如果用户单击其他地方-上下文菜单应消失 我遇到了上述问题,即有时上下文菜单正确显示,有时在用户做出选择后立即出现和消失。请帮忙。请参阅下面我的代码的相关部分。此外,当用户通过双击选择一个段落或一个单词时,上下文菜单会出现,并很快再次消失 var ContextMenu = { ... show: function(e) {

我对多个事件处理程序有一个奇怪的jquery问题。我试图实现的是:

用户在页面上选择一些文本 如果所选内容不为空-显示关联菜单 如果用户单击其他地方-上下文菜单应消失 我遇到了上述问题,即有时上下文菜单正确显示,有时在用户做出选择后立即出现和消失。请帮忙。请参阅下面我的代码的相关部分。此外,当用户通过双击选择一个段落或一个单词时,上下文菜单会出现,并很快再次消失

var ContextMenu = {
   ...
        show: function(e) {
            var z = this;
            if (!this.shown) {
                if (this.contextMenu) {
                    this.contextMenu.css({
                        left: e.pageX,
                        top: e.pageY
                    }).slideDown('fast');
                    this.shown = true;
                }
                var hideHandler = function() {
                    z.hide(this);
                };
                $(document.body).bind("click", hideHandler);
            }
        },
        hide: function(hideHandler) {
            if (this.contextMenu && this.shown) {
                this.contextMenu.slideUp('fast');
                this.shown = false;
                $(document.body).unbind("click", hideHandler);

            }
        }
};
    // Context menu display logic
    $(document.body).bind("mousedown mouseup", function(e) {
        if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) {
            ContextMenu.show(e);
        }
    });

查看仅将事件绑定到mouseup是否有帮助:

据我所知,你不需要将它绑定到mousedown事件

我认为,如果您将其绑定到mousedown事件,并且用户通过拖动鼠标并按下按钮进行选择,您的上下文菜单将显示mousedown,并且当鼠标按钮仍然按下时,单击处理程序将绑定到文档。因此,在完成选择时释放鼠标按钮后,将执行单击,并执行先前绑定的单击处理程序,使菜单再次消失


但我可能错了

感谢Felix的回答,不幸的是,这并没有解决这个问题:在更改为“mouseup”后,我的上下文菜单出现并立即消失100%的时间。我不知道该怎么办。@Felix-我会在绑定hide click处理程序时尝试设置超时;按照Nick Craver的建议,我尝试更改这一行:$document.body.bindclick,hideHandler;to:setTimeoutfunction{$document.body.bindclick,hideHandler;},2000;它只工作一次-上下文菜单显示正确的行为。然而,在那之后,事物会立即回滚以显示/消失。还有其他想法吗?我在我的上下文菜单中添加了一个“关闭”按钮,它工作得很好,尽管它不是很优雅。
$(document.body).bind("mouseup", function(e) {
     if ((window.getSelection().toString() != "") && (!ContextMenu.shown)) {
         ContextMenu.show(e);
     }
 });