検索

ポイントイベントの使い方

May 29, 2018 am 10:32 AM
イベント使用

今回は、Point イベントの使い方と、Point イベントを使用する際の注意事項について説明します。以下は実際のケースです。見てみましょう。

はじめに

この記事は長い間下書きボックスに眠っていましたが、最近関連する問題に遭遇したため、もう一度整理しました。これは CSS ポインター イベントに関するものではないことに注意してください。以下ではすべてを述べませんが、詳細な紹介を見てみましょう。

原因

暗い嵐の夜から、誰かが私たちのウェブアプリがChromeシミュレーターでエラーを報告し始めたことを発見しました。エラーメッセージはおそらく次のとおりでした。

VM1023:1 Uncaught TypeError: Cannot read property '0' of unknown

しかし、問題があるのは彼のブラウザだけであり、私のマシンでは同じことを繰り返さないという精神で、機能には影響しません。当時はとても忙しかったので、この問題の優先順位は高くありませんでしたが、しばらくすると、同じ問題を抱えている人が徐々に増えてきたため、この問題に注目するようになりました。

位置の問題コードは、コールスタックに基づいてすぐに特定されました。ソースコードは、おそらく次のような、前の同僚によって書かれたコンポーネントコードでした。イベントがこのフィールドに触れなかったため、イベントがトリガーされ、

が例外をスローしました

。しかし、以前は問題なく動作していたのですが、ブラウザの API が変更されたのでしょうか?そして、ポインターダウンイベントについては知りませんでしたが、このイベントは何を処理するために使用されるのでしょうか?そこで私は 2 つの質問から調査を開始しました:

ポインターダウン イベントとは何ですか?

  • なぜ突然エラーが発生し始めたのですか? 問題は、W3C の公式ドキュメントを読むことです。ここで私の理解を簡単に説明します。

  • デバイス入力フォームの多様化

  • PC時代では、マウスを介して画面を操作します。現時点では、システムを設計する際に考慮する必要があるのはマウスイベントだけです。しかし、現在では、スマートフォンやタブレットなど、タッチやスタイラスなどの他の入力方法を備えた新しいデバイスが数多く登場しており、当局はこれらの入力フォーム用の新しいイベントも提供しています。

しかし、開発者にとって、これは非常に面倒なことです。たとえば、ユーザーの動きに基づいて絵を描きたい場合は、PCに対応する必要があるため、Webページにさまざまなイベントを適応させる必要があります。コードは次のようになります

dom.on('touchstart pointerdown', function (event) {
 /*部分业务代码*/
 var touch = event.touches[0]; //报错的地方
 /*部分业务代码*/
})
より多くの入力デバイスと互換性を持たせる必要がある場合はどうすればよいですか?たとえば、スタイラスの場合、コードは非常に複雑になります。さらに、既存のマウス イベントベースのコードと互換性を保つために、多くのブラウザーはすべての入力タイプに対してマウス イベントをトリガーします (たとえば、touchmove がトリガーされると、mousemove がトリガーされます。Chrome でテストしましたが、トリガーされませんでした)。デバイス、スタイラスがない状況はテストされていません)、これはイベントが実際にマウスによってトリガーされたかどうかを確認できないことにもつながります。

複数の入力フォームと互換性を持たせる方法

この一連の問題を解決するために、W3C は新しい入力フォーム、つまりポインターを定義しました。マウス、タッチ、スタイラス、またはその他の入力デバイスによってトリガーされる画面上の接触は、ポインター イベントとしてカウントされます。

その API はマウス イベントに非常に似ており、移行が非常に簡単です。 clientX、ターゲットなどのマウス イベントによく使用されるプロパティを提供することに加えて、開発者がポインタ イベントを使用できるように、圧力、接触面、傾斜角などの他の入力デバイスのプロパティも提供します。すべての入力を提供するため、デバイスは独自の機能を開発します。

提供されるプロパティ

ポインターイベントは、いくつかの一意のイベント属性を提供します

pointerId: 現在のポインターイベントの一意の識別子、主にマルチタッチ中の唯一の入力ソースを識別します

width : の幅接触面

高さ: 接触面の高さ

  • pressure:接触的压力值,范围是0-1,对于不支持压力的硬件,比如鼠标,按压时该值必须为 0.5,否则为 0

  • tiltX,titltY:手写笔的角度

  • pointerType:事件类型,目前有 mouse,pen,touch,如果是无法探测的指针类型,则该值为空字符串

  • isPrimary:用于标识是否是主指针,主要是在多点触控中生效,开发者也可以通过忽略非主指针的指针事件来实现单点触控。

  • 如何确定主指针:

    鼠标输入:一定是主指针

    触摸输入:如果 pointerdown 触发时没有其他激活的触摸事件,isPrimary 为 true

    手写笔输入:与触摸事件类似,pointerdown 触发时没有其他激活的 pointer 事件

    相关事件

    事件名称 作用
    pointerover 与 mouseover 行为一致
    pointerenter 与 mouseenter 行为一致
    pointerdown 指针进入活动状态,比如触摸了屏幕,类似于 touchstart
    pointermove 指针进行了移动
    pointerup 指针取消活动状态,比如手指离开了屏幕,类似于 touchend
    pointercancel 类似于 touchcancel
    pointerout 指针离开元素边缘或者离开屏幕,类似于 mouseout
    pointerleave 类似于 mouseleave
    gotpointercapture 元素捕获到指针事件时触发
    lostpointercapture 指针被释放时触发

    可以看到,pointer 事件与已知的事件类型基本一致,但是有一点区别:在触摸屏上,我们可能会滑动屏幕来触发页面滚动,缩放或者刷新,对于 touch 事件,这时会触发 touchmove,但是对于 pointer 事件,当触发这些浏览器行为时,你却会接收到 pointercancel 事件以便于通知你浏览器已经接管了你的指针事件。

    如何检测

    首先,pointer 事件的支持程度已经很不错了,你可以使用 Pointer Events polyfill (本地下载)来进行兼容,也可以自行检测

    if (window.PointerEvent) {
     // 支持
    } else {
     // 不支持
    }

    导致问题的原因

    这时候,对于本文一开始提到的问题就显而易见了,因为 point events 是没有 touches 这个属性的。那么我们还有两个问题。

    为什么之前会用到 point events?

    后来我看了下 zepto 的源码,在事件处理时是考虑到了 point event 的,同事之前写的代码大概是参考了 zepto 的事件系统。

    为什么会突然爆发这个问题?

    很简答,Chrome 55 开始支持这个 API,Chrome 具体的支持信息可以参考官方日志,至于怎么检测浏览器支持,可以参考上面的内容

    相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    怎样使用Vue中字符串模板

    如何处理Mac安装thrift因bison报错

    以上がポイントイベントの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

    Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

    JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

    JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

    Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

    Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

    Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

    PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

    C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

    C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

    JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

    さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

    ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

    現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

    next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

    私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    SecLists

    SecLists

    SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境