我正在使用一些javascript UI,並使用大量觸摸事件(如'touchend')來改進觸摸設備的響應。不過,也有被竊聽我JavaScript touchend與點擊困境
我已經看到,許多開發人員打成一片「touchend」,並在同一事件「點擊」一些邏輯問題...。在許多情況下,它不會傷害,但實質上該函數將在觸摸設備上兩次閃光:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
有人建議,人們可以檢測觸摸能力,並適當例如設置事件:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
上面的問題是,它會在支持觸摸和鼠標的設備上中斷。如果用戶當前在雙輸入設備上使用鼠標,「點擊」將不會觸發,因爲只有「touchend」被分配給該按鈕。
另一種解決方案是檢測設備(例如「iOS」)並根據以下事件分配事件: Click event called twice on touchend in iPad。 當然,上述鏈接中的解決方案僅適用於iOS(不適用於Android或其他設備),並且似乎更像是一種「黑客」來解決相當基本的問題。
另一解決方案是,以檢測鼠標移動,和具有觸摸能力結合起來,以找出如果用戶在鼠標或觸摸。問題當然是,用戶可能不會將鼠標從想要檢測的時候移開...
我能想到的最可靠的解決方案是使用簡單的debounce函數來簡單地確保函數在短時間間隔內觸發一次(例如100ms):
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
我錯過了什麼,或者沒有人有更好的建議嗎?
編輯:我發現我的帖子,這表明了類似的解決方案,上述後此鏈接: How to bind 'touchstart' and 'click' events but not respond to both?
沒有任何解決方案... Modernizr只是檢測'觸摸'。該事件在觸摸設備上仍會觸發兩次。或者,如果您爲觸摸設備(通過modernizr)分配「觸摸」事件,它將停止對在多個Windows8設備等雙輸入設備上使用鼠標的用戶的工作。 – suncat100 2014-08-29 16:34:13