安卓平台的瀏覽器 touchend 事件觸發失效?

點擊應該觸發 touchstart 和 touchend 兩個事件,但是安卓手機中並沒有觸發 touchend,請問如何解決這個問題?


感謝啊,莫名其妙的問題


touch事件在手機瀏覽器上存在莫名的兼容性問題, 會導致touchend事件不觸發!

http://code.google.com/p/android/issues/detail?id=19827

Working with touch events

On Android ICS if no preventDefault is called on touchstart or the first touchmove, further touchmove events and the touchend will not be fired.

As a workaround we need to decide in the first touchmove if this is a scroll (so we don』t call preventDefault) and then manually trigger touchend.

如果你沒有太多顧慮(關於scroll的), 請在touchstart的handle中使用event.preventDefault(), 即可讓touchend事件正常觸發


最近幾天開發也碰到了這個問題,項目要模擬一個app的向下拉動載入效果。我的解決辦法是在touchmove中添加e.preventDefault(),將瀏覽器默認的滑動慣性去掉,這樣就不會干擾到touchend事件的觸發,然後再手寫滑動效果,另外需要注意判定是否有滑動產生,避免干擾默認的點擊效果觸發:

var x, y, z;

var slideCouter = 1;
var hasMoved = false;
var checking = false;
var hasMore = true;
$(document).on(touchstart, function (e) {
z = $(document).scrollTop();
x = event.targetTouches[0].pageY;
}).on(touchmove, function (e) {
e.preventDefault();
hasMoved = true;
y = event.targetTouches[0].pageY;
z += x - y;
$(document).scrollTop(z);
}).on(touchend, function (e) {
if (x - y &> 200 !checking hasMoved hasMore) {
checking = true;
slideCouter++;
$(.login).removeClass(none);
$.ajax({
url: "&createUrl(/teacher/categoryMore);?&>",
type: "get",
data: {
"keyword": &,
"page": slideCouter
},
cache: false,
success: function (data) {
completecall(data);
}
});
}
hasMoved = false;
});
==============
目前別的方法都會有或多或少的弊端,該方法的弊端就是滑動慣性被取消,自己寫的效果會不那麼流暢,但還算比較好的解決這個兼容問題。


可以考慮同時監聽touchcancel事件。


@jack king 使用touchcancel這個在android4.4中會出現複製文本之類的

複製文本是什麼狀況


我也想知道


我也遇到了這個問題啊,需要顧慮scroll,阻止默認事件這個行不通,使用touchcancel這個在android4.4中會出現複製文本之類的,這個要怎麼解決? @bo bo


我要顧慮scroll,怎麼解決這個問題啊?


推薦閱讀:

一旦打開就忍不住想狂點滑鼠,9 個有趣的 HTML 5 交互網站
SegmentFault 技術周刊 Vol.20 - 用 Canvas 畫個星空
極樂前端周報 ( 第三期 )

TAG:前端開發 | HTML5 | 移動瀏覽器 |