2013-02-14 86 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