ネイティブ JS を使用してタップ イベントをカプセル化し、モバイル端末の 300 ミリ秒の遅延を解決します

高洛峰
リリース: 2016-11-19 11:28:56
オリジナル
1783 人が閲覧しました

FastClick

この問題を解決できる既製のプラグイン fastclick がありますが、欠点もあります。

GitHub 上のプラグインの最新バージョンのサイズは 25.4kb で、軽量化がトレンドです。だからできる限り節約してください。

その中心となるアイデアは、デフォルトのクリック時間をキャンセルし、現在の DOM ノードのタイプを判断し、対応する操作を実行することです。この判断プロセスは比較的面倒です。

MyTapEvent

私は最近 WeChat プロジェクトに取り組んでいます。fastclick プラグインにはいくつかの欠点があるため、主なアイデアは次のとおりです。

考え中

タップ イベントには touchstart が含まれています。 touchmove(微動))とtouchendの3つの状態

touchend後にコールバックメソッドが実行されます

Chromeブラウザのデフォルトの判断により、指のオフセット(水平or縦)15pxを超えるとスクロールと判断されタップイベントがキャンセルされます

指を長く押しすぎるとクリックとみなされません

プロトタイプを展開するにはHTMLElementを使用します。イベントを簡単に追加するには

シングルトン モードを使用して、一度だけロードされるようにします

OK、落ち着いてコードを書き始めてください。はるかに明確です:

if (!HTMLElement.prototype.addTapEvent) { HTMLElement.prototype.addTapEvent = function(callback) { var tapStartTime = 0, tapEndTime = 0, tapTime = 500, //tap等待时间,在此事件下松开可触发方法 tapStartClientX = 0, tapStartClientY = 0, tapEndClientX = 0, tapEndClientY = 0, tapScollHeight = 15, //水平或垂直方向移动超过15px测判定为取消(根据chrome浏览器默认的判断取消点击的移动量) cancleClick = false; this.addEventListener('touchstart', function() { tapStartTime = event.timeStamp; var touch = event.changedTouches[0]; tapStartClientX = touch.clientX; tapStartClientY = touch.clientY; cancleClick = false; }) this.addEventListener('touchmove', function() { var touch = event.changedTouches[0]; tapEndClientX = touch.clientX; tapEndClientY = touch.clientY; if ((Math.abs(tapEndClientX - tapStartClientX) > tapScollHeight) || (Math.abs(tapEndClientY - tapStartClientY) > tapScollHeight)) { cancleClick = true; } }) this.addEventListener('touchend', function() { tapEndTime = event.timeStamp; if (!cancleClick && (tapEndTime - tapStartTime) <= tapTime) { callback(); } }) } }
ログイン後にコピー

使用法

HTMLElement.addTapEvent(function(){ //do something...}) 如:document.querySelect('#test').addTapEvent(function(){ alert('this is a tap event'); })
ログイン後にコピー

ケース

これはモバイル ケースです。最初の 20 項目はタップ イベント、最後の 30 項目はクリック イベントです。効果を試して、2 つの方法の違いを感じてください。

関連ラベル:
js
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!