成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入了解iPad上的MouseEvent

移動開發 iOS
在iPad上(或者說各個移動終端上),你的WebAPP應該能處理好TouchEvent,而不再依賴于MouseEvent。然而如果你的WebAPP需要同時面向PC和iPad兩種平臺的瀏覽器用戶,而迫于時間或者人力配備你沒法分別提供兩種版本的時候。。。你也許有必要了解一下下面這些有關iPad上MouseEvent相關的細節,然后砍掉兩個平臺上有明顯差異的一些花哨特性,這樣才能做出一個較好地兼容兩個平臺的WebAPP。

iPad上沒有鼠標,所以手指在觸發觸摸事件(TouchEvent)的時候,系統也會產生出模擬的鼠標事件(MouseEvent)。
這對于普通網頁的瀏覽需求而言,基本可以做到與PC端瀏覽器無明顯差異。但是如果你正在做一款與用戶有著強交互的WebAPP程序,比如一個html5小游戲或者圖片處理工具什么的,那么依賴默認模擬恐怕不能滿足產品的需求。
一個通常的建議是:在iPad上(或者說各個移動終端上),你的WebAPP應該能處理好TouchEvent,而不再依賴于MouseEvent。
然而如果你的WebAPP需要同時面向PC和iPad兩種平臺的瀏覽器用戶,而迫于時間或者人力配備你沒法分別提供兩種版本的時候。。。你也許有必要了解 一下下面這些有關iPad上MouseEvent相關的細節,然后砍掉兩個平臺上有明顯差異的一些花哨特性,這樣才能做出一個較好地兼容兩個平臺的 WebAPP。     

在閱讀下文前,我假設你已經熟悉PC瀏覽器上MouseEvent的運作,也對TouchEvent有了粗略的了解。如果你并不了解,那理解以下各個細節可能有困難。

safari只對可點擊(clickable)的HTML元素才會產生MouseEvent。這在ADC文檔中也提到了。 什么叫可點擊,ADC文檔定義是只要HTML元素響應mousemove、mousedown、mouseup、click四種MouseEvent中的 一個就算是可點擊。如果你有個網頁菜單只響應mouseover、mouseout,那可能不能工作,加個onclick="void(0)"就行了。但 實際測試發現,只要響應任意一個MouseEvent就算可點擊了,估計safari已修正此問題。
注意:下文所有關于“可點擊”“不可點擊”的描述都是針對是否響應MouseEvent而言,而不是指TouchEvent。

與W3C規范建議的不同,iPad是在手指離開屏幕以后才可能會產生MouseEvent。 所以像手指單擊屏幕這種操作的實際事件序列通常 是:touchstart->touchend->mousemove->mousedown->mouseup->click; 而不是我們期望的這樣的時 序:touchstart->mousedown->touchend->mouseup->click。

手指快速單擊屏幕觸發的MouseEvent并不是緊跟在TouchEvent之后的,有一個時延。 這是為了等待可能的雙擊操作。iPad2 Safari的實測時延大約為375ms。所以實際時序大約是這樣的:(手指按下)touchstart->(手指快速提 起)touchend->(等待約375ms)mousemove->mousedown->mouseup->click。
這對WebAPP的直接影響就是由于從用戶操作完(手指提起)到onclick執行有375ms的延時,用戶總覺得你的軟件反應有點慢半拍。
但如果單擊速度較慢,即手指按下到提起之間的時延超過大約120ms,touchend到其他MouseEvent之間就不再會有這個375ms的時延。因為系統認為這已經不滿足手指快速雙擊操作的判定條件。

手指快速雙擊屏幕操作不會觸發任何MouseEvent。我 是說“任何”,就是說不光不會觸發dblclick事件,連mousedown、mouseup、click等等所有MouseEvent都不會有。本操 作默認的事件流是:touchstart->touchend->touchstart->touchend。如果頁面開發人員不做任 何限制,瀏覽器默認行為是嘗試縮放網頁。

一次手指單擊操作不會同時產生mouseover和(mousedown、mouseup、click)兩組事件。如 果一個響應mouseover事件的元素從渲染完畢或者上一次收到mouseout之后尚未收到mouseover事件,則單擊觸發的事件流 為:touchstart->touchend->mouseover->mousemove;反之,單擊觸發的事件流 為:touchstart->touchend->mousemove->mousedown->mouseup->click。
不響應mouseover事件的元素只會收到上述后一種事件流,這避免絕大多數鏈接需要手指點擊兩次才能跳轉頁面。

一個HTML元素收到mouseover之后,只有在手指點擊另一個可點擊的HTML元素時,才會收到mouseout事件。因 為沒有鼠標,所以不能像PC機上一樣在鼠標移入移除元素區域時觸發mouseover和mouseout事件,只能靠手指點擊來切換mouseover; 又因為不可點擊的元素不會觸發任何MouseEvent,所以只有在另一個HTML元素上觸發MouseEvent時前一個可點擊元素才會收到 mouseout事件。

手指在屏幕上移動,不會觸發大量的mousemove事件。如 第2點所說,只有在手指離開屏幕時,才可能產生MouseEvent消息,所以你只可能收到一次mousemove事件,包括本次操作觸發的其他所有 MouseEvent,坐標都是手指提起位置的坐標。所以在PC瀏覽器上通過mousemove實現的邏輯,在iPad上需要通過TouchEvent來 實現。

實測發現,似乎手指在屏幕上緩慢移動時,提起手指才會觸發MouseEvent;如果手指快速移動,則提起手指不會觸發任何MouseEvent。原因不明。

如果一個HTML元素響應TouchEvent,手指在該元素上按下并移動,即使手指移出該元素的區域,該元素仍然會收到touchmove事件,直到手指提起收到一個touchend結束。也就是說一個HTML元素通常總能收到一個完整的touchstart->(N個)touchmove->touchend事件序列,除非系統給它發出一個touchcancel事件。這跟PC瀏覽器上MouseEvent特性也不太相同。

一旦在一次手指操作的事件序列touchstart->(0-N個)touchmove->touchend中的任何一個事件函數里調用了event.preventDefault(),本次操作不再產生任何MouseEvent。所以不能期望在touchstart中調用preventDefault只阻止mousedown事件的產生。

以上各個特性在iPad2/iOS4.3.3的safari上測試驗證過,對于其他safari內核的瀏覽器(如QQ瀏覽器HD等)都是適用的。至于其他非safari內核的瀏覽器,在MouseEvent的支持上基本都不如safari完整和合理。例如Opera Mini只有手指單擊屏幕時產生MouseEvent,并且不支持TouchEvent;UC瀏覽器雖然將mousedown移到了touchstart 之后,但是手指移動后提起來卻不能產生mouseup事件。有興趣的可以做進一步測試。Android用戶也可以在Android平板電腦上做一些測試, 如果能將測試結果分享給我,我將非常感謝。

【 附錄及參考文檔】

1. 測試頁面鏈接:http://hokyhu.sinaapp.com/event_test.html
你還可以在這個頁面上體驗iPad強大的多點觸摸功能,試試看最多能檢測到幾個觸點。
2. W3C關于TouchEvent的技術草案:https://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html
該草案主要定義了TouchEvent相關的技術細節,并少量涉及TouchEvent與MouseEvent之間的配合。
3. ADC文檔:https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/SafariWebContent.pdf
文檔在“Handling Events”這一章描述了對MouseEvent的支持。

責任編輯:閆佳明 來源: oschina
相關推薦

2010-06-23 20:31:54

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2020-07-20 06:35:55

BashLinux

2019-08-02 08:59:21

Token認證服務器

2019-11-29 16:21:22

Spring框架集成

2017-01-20 08:30:19

JavaScriptfor循環

2018-02-24 13:21:02

2018-09-04 16:20:46

MySQ索引數據結構

2016-10-20 08:46:17

2021-09-03 08:27:47

FortinetSASE平臺安全

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-15 11:40:44

Oracle表空間

2018-06-22 13:05:02

前端JavaScript引擎

2021-01-19 12:00:39

前端監控代碼

2010-09-27 09:31:42

JVM內存結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美网站一区二区 | 欧美日韩一区二区视频在线观看 | 99精品99| 中文字幕亚洲欧美 | 国产成人精品免费 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 天堂一区二区三区 | 一级欧美一级日韩片免费观看 | 亚洲精品一区二区三区中文字幕 | 国产免费一级片 | 亚洲国产精品美女 | 成人视屏在线观看 | 亚洲欧美一区二区三区国产精品 | 国产一区二区三区久久久久久久久 | 久久精品视频网站 | 国产精品九九视频 | 色.com | 日韩av在线中文字幕 | 在线观看视频一区 | 亚洲天堂999| 在线观看成人小视频 | 偷拍自拍网址 | 日韩中文字幕视频 | 国产高清在线视频 | 欧美日韩在线观看一区 | 亚洲国产成人在线视频 | 亚洲精品二三区 | 亚洲第一天堂无码专区 | 久久69精品久久久久久久电影好 | 欧美久久一区二区 | 国产做a爱免费视频 | 91精品国产91久久久久久 | av国产精品毛片一区二区小说 | 国产成人麻豆免费观看 | 麻豆视频在线看 | 国产日韩一区二区 | 日日操夜夜操天天操 | 九九久久精品 | 女同av亚洲女人天堂 | 亚洲精品欧美一区二区三区 | 91五月天 |