【问题标题】:how to add dbclick() on right click in jquery如何在jquery中右键单击添加dbclick()
【发布时间】:2012-08-23 18:59:11
【问题描述】:

您好,我想在右键单击时使用 dblclick(),因为谷歌地图必须放大和缩小。有没有办法做到这一点。我已经编写了 dblclick,但现在它只需要左键单击即可工作。有关如何执行此操作的任何指示。这是我的代码

         $("div#demo1").dblclick(function(e) {
            //alert(e.getElementById());

            if( (!$.browser.msie && e.button == 0) || ($.browser.msie && e.button == 1) ) {
                alert("Left Mouse Button was clicked on demo1 div!");
                $("div.window").animate({
                'height':'+=20', 'width':'+=20'
                },0,function(){
                    jsPlumb.repaintEverything();
                    jsPlumb.repaintEverything();
                });
                // Left mouse button was clicked (all browsers)
            }
            else if( (!$.browser.msie && e.button == 2) || ($.browser.msie && e.button == 3) ) {
                alert("right click double");
            }
        }); 

【问题讨论】:

  • jQuery normalizes 按钮值改为e.which,不需要管道代码。
  • @Esailija:是的,我现在看到了。有没有办法在双击而不是单击时调用?

标签: javascript jquery


【解决方案1】:

还有另一种方法可以检测双击右键,它不涉及摆弄计时器或手动跟踪点击次数。在mouseupmousedown 事件中使用事件对象的.detail 属性。 .detail 持有click count,它将告诉您最近发生了多少点击。如果.detail === 2 是双击。

// suppress the right-click menu
$('#target').on('contextmenu', function (evt) {
    evt.preventDefault();
});

$('#target').mouseup(function (evt) {
  if (evt.which === 3) { // right-click
    /* if you wanted to be less strict about what
       counts as a double click you could use
       evt.originalEvent.detail > 1 instead */
    if (evt.originalEvent.detail === 2) { 
      $(this).text('Double right-click');
    } else if (evt.originalEvent.detail === 1) { 
      $(this).text('Single right-click');
    }
  }
});

您可能会注意到我使用evt.originalEvent.detail 来访问该属性,而不仅仅是.detail。这是因为 jQuery 提供了它自己的事件对象版本,其中不包含.detail,但是您可以访问浏览器通过.originalEvent 返回的原始事件对象。如果您使用纯 JavaScript 而不是 jQuery,您只需使用 evt.detail

这是working example

【讨论】:

  • 这个答案远远优于其他答案,原因很简单:最终用户可以决定什么是双击。如果您将默认时间硬编码到您的代码中,那些更改了默认时间的人可能 1) 认为您的网站已损坏,和/或 2) 不使用它,因为他们不能快速点击足够的。我刚刚在 Chrome、Firefox、Opera 和 IE 的 Windows 上使用不同的点击速度设置对此进行了测试,并且在所有这些设置中都运行良好。
【解决方案2】:

没有真正的方法可以做到这一点,您可以通过采用默认的双击计时器来模拟它,IIRC 是 300 毫秒:

function makeDoubleRightClickHandler( handler ) {
    var timeout = 0, clicked = false;
    return function(e) {

        e.preventDefault();

        if( clicked ) {
            clearTimeout(timeout);
            clicked = false;
            return handler.apply( this, arguments );
        }
        else {
            clicked = true;
            timeout = setTimeout( function() {
                clicked = false;
            }, 300 );
        }
    };
}

$(document).contextmenu( makeDoubleRightClickHandler( function(e) {
    console.log("double right click" );
}));

http://jsfiddle.net/5kvFG/2/

【讨论】:

【解决方案3】:

由于右键单击对 javascript 范围之外的用户代理(上下文菜单)有意义,因此您将不得不做一些跳舞。

首先,您应该禁用目标元素上的上下文菜单:

document.getElementById('demo1').oncontextmenu = function() {
    return false;
};

现在,当我们右键单击时,不会有上下文菜单搞乱第二次单击。

接下来要明白“双击右键”一般来说是不存在的。即使您可以绑定dblclick 事件,这也不是通用事件。 “双击”顾名思义就是用鼠标左键双击。

因此,我们将不得不使用mousedown 事件,检查右侧被点击了多少次,然后在两次之后做出反应。我创建了一个小型辅助函数,用于跟踪点击次数并在短时间内重置状态。

var RightClick = {
    'sensitivity':350,
    'count':0,
    'timer':false,
    'active':function () {
        this.count++;
        this.timer = setTimeout(
            this.endCountdown.bind(this),
            this.sensitivity
        );
    },
    'endCountdown': function () {
        this.count = 0;
        this.timer = false;
    }
};
$("div#demo1").mousedown(function(e) {
    if(e.which == 3) {
        RightClick.active();
        if (RightClick.count == 2)
            alert("right click double");
    }
});

在这里试试:http://jsfiddle.net/94L7z/

您可以调整敏感度,允许更短或更长的双击,具体取决于您的偏好。

文档

【讨论】:

  • 对时间进行硬编码不考虑更改双击速度的用户,Useless Code's answer 会这样做。
  • @kevinmicke 客户端跟踪点击计数,并在一定时间后重置,大约 350 毫秒。我不反对使用 event.detail ...我只是不知道。显然,我并不孤单。也就是说,这种类型的解决方案同样有效。您可以对另一种方法的示例进行缓慢的双击,它也只注册一次单击......这样,这种方法甚至可能更好。如果您的用户抱怨双击右键不能可靠地工作,您确定这是因为速度。这个你可以调整。 Event.detail,无法调整。
  • 在看到另一个答案之前,我也不知道 event.detail 。我不同意这种类型的解决方案同样有效:更改系统的双击速度确实是测试我的意思的唯一方法。一些用户将他们的双击速度更改为非常慢,因为他们无法使用鼠标/触摸板等,因此对于这些用户来说,双击可能是在他们使用的任何其他站点或程序上在一整秒内单击两次。但是当他们来到一个将双击右键硬编码为 350 毫秒的站点时,他们可能会认为该站点已损坏。
  • @kevinmicke 所以我们有一种情况,边缘情况(在操作系统级别更改了双击速度的用户)可能会产生问题。我想我还是宁愿保持对它的控制,除非它成为一个问题。也许两种解决方案的组合更好?无论如何,这些技术已经摆在桌面上,供未来的读者决定哪种技术最适合他们的用例。
  • @kevinmicke 另外,否决票? “这个答案没用”——我也不同意。并不是说我太担心分数,但我也相信这个答案,或者 Esailija 的,不是没用的。我很奇怪你如此激烈地反对我们的做法。
【解决方案4】:

问题是,就JS而言,双击的概念只与鼠标左键有关。因此,无论您单击鼠标右键多少次,以多快的速度单击鼠标右键,它都只会注册为一堆单击。那么该怎么办呢?

  1. 创建一个全局变量来跟踪点击次数
  2. 检测到单击右键,您似乎已经知道该怎么做
  3. 设置触发一次右键的全局变量
  4. 设置一个超时,所以如果另一个右键单击没有通过 合理的时间被认为是一个 dblclick 全局变量 重置为0。我推荐300毫秒,这似乎是最自然的
  5. 每次右键单击寄存器检查该变量,如果它更多 比一个,触发你的双击右键处理程序。
  6. 您可能希望将该全局变量设为对象,以便跟踪哪个元素 注册右键并过期特定元素右键 因此。如果他们双击,这将允许您忽略 同时将鼠标移动到各种对象上。我认为这 可选的,因为用户不太可能遵循事件链, 但根据您的应用,可能会导致意外功能。

【讨论】:

    【解决方案5】:

    用这个 (try it) 定义一个 jQuery 函数可能会更好:

    var precision = 400;
    var lastClickTime = 0;
    
    $(document).ready(function()
    {
        var div = $('#div');
    
        $(div).bind("contextmenu", function(e)
        {
            return false;
        }); 
    
        $(div).mousedown(function(event)
        {
            if (event.which == 3)
            {
                var time = new Date().getTime();
    
                if(time - lastClickTime <= precision)
                {
                    // DOUBLE RIGHT CLICK
                    alert('double click');
                }
    
                lastClickTime = time;
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 2018-07-03
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多