2013-02-14 59 views
4

如何自动将长时间点击事件转化为右键点击事件?由于像iPad这样的许多触摸设备不提供在网站上右键点击的方式,这将非常方便,因为网站的代码不需要调整。JavaScript:将长时间点击事件转化为右键点击事件

例如这段代码是专为具有鼠标支持桌面浏览器:

<html> 
    <head><title>Long tap to right click test</title></head> 
    <body> 
     <img src="dummy.png" oncontextmenu="alert('Hi!'); return false;" width="20" height="20" /> 
    </body> 
</html> 

的目标是无需修改代码转换长击事件,右击事件。 (当然,只是加载一些JavaScript。)

如果看到https://github.com/furf/jquery-ui-touch-punch/对jQuery小部件的drag'n'drop支持做了类似的操作。但是,这个插件不支持长按。

另外http://code.google.com/p/jquery-ui-for-ipad-and-iphone/实际上执行所需的翻译,但它刹车滚动,从而使它对常规网站需要滚动支持无用。

任何帮助表示赞赏 - 谢谢!

回答

1

您可以使用超时为:

var timeoutLongTouch; 
var $mydiv = $j('#myDiv'); 

// Listen to mousedown event 
$mydiv.on('mousedown.LongTouch', function() { 
    timeoutLongTouch = setTimeout(function() { 
     $mydiv.trigger('contextmenu'); 
    }, 1000); 
}) 
// Listen to mouseup event 
.on('mouseup.LongTouch', function() { 
    // Prevent long touch 
    clearTimeout(timeoutLongTouch); 
}); 
+0

Vielen Dank!同样如下:这可以更通用一些,所以我不需要在所有我想使用它的元素上使用选择器,但有一个“全局”转换? – jor 2013-02-14 14:21:08

6

你可以写简单的插件来处理这种类型的事件。让我们称之为longTap事件。例如:

$.fn.longTap = function(options) { 

    options = $.extend({ 
     delay: 1000, 
     onRelease: null 
    }, options); 

    var eventType = { 
     mousedown: 'ontouchstart' in window ? 'touchstart' : 'mousedown', 
     mouseup: 'ontouchend' in window ? 'touchend' : 'mouseup' 
    }; 

    return this.each(function() { 
     $(this).on(eventType.mousedown + '.longtap', function() { 
      $(this).data('touchstart', +new Date); 
     }) 
     .on(eventType.mouseup + '.longtap', function(e) { 
      var now = +new Date, 
       than = $(this).data('touchstart'); 
      now - than >= options.delay && options.onRelease && options.onRelease.call(this, e); 
     }); 
    }); 
}; 

显然,你想在iPad上的情况下,改变mousedownmouseuptouchstarttouchend

用法:http://jsfiddle.net/dfsq/RZgxT/1/

+0

感谢您的回复!不幸的是,这个解决方案要求我必须修改我所有网站的代码,并用右键单击事件调用所有元素的longTap函数。问题是,我的代码不仅使用右键单击事件,而且还由一些JavaScript插件触发。我将不得不深入修改一切:-(。 – jor 2013-02-14 14:19:33