ホームページ ウェブフロントエンド jsチュートリアル Web開発におけるイベント処理ルールとは何ですか?

Web開発におけるイベント処理ルールとは何ですか?

Jun 04, 2018 am 10:14 AM
web どれの

今回は、Web開発におけるイベント処理のルールと、Web開発におけるイベント処理の注意事項について、実際の事例を交えて見ていきましょう。

イベント処理

イベントがトリガーされると、イベント object (イベント オブジェクト) がコールバック パラメーターとしてイベント ハンドラーに渡されることがわかっています。例:

// 不好的写法function handleClick(event) {  var pop = 
document
.getElementById('popup');
  popup.style.left = event.clientX + 'px';
  popup.style.top = event.clientY + 'px';
  popup.className = 'reveal';
}// 你应该明白addListener函数的意思addListener(element, 'click', handleClick);
ログイン後にコピー

このコードは、イベント オブジェクト: clientX および clientY。これら 2 つの属性を使用して、ページに要素を表示する前に要素を配置します。このコードは非常に単純で問題がないように見えますが、このアプローチには制限があるため、実際には不適切な記述です。

ルール 1: アプリケーション ロジックを分離する

上記のコード例の最初の問題は、イベント ハンドラーにアプリケーション ロジックが含まれていることです。アプリケーション ロジックは、ユーザー 行動 ではなく、アプリケーションに関連する機能コードです。上記のコード例のアプリケーション ロジックは、特定の場所にポップアップ ボックスを表示することです。このインタラクションはユーザーが特定の要素をクリックしたときに発生するはずですが、常にそうであるとは限りません。

同じロジック部分が他の場所でトリガーされる可能性があるため、アプリケーション ロジックをすべてのイベント ハンドラーから分離することがベスト プラクティスです。たとえば、ユーザーが要素の上にマウスを移動したときにポップアップ ボックスを表示するかどうかを決定したり、キーボードの特定のキーが押されたときに同じ論理的判断を行う必要がある場合があります。このように、複数のイベント ハンドラーが同じロジックを実行しますが、コードは誤って複数回コピーされます。

イベント ハンドラーにアプリケーション ロジックを配置することのもう 1 つの欠点は、テストに関連しています。テストするときは、要素のクリックをシミュレートするのではなく、関数コードを直接トリガーする必要があります。アプリケーション ロジックがイベント ハンドラーに配置されている場合、それをテストする唯一の方法は、イベントを発生させることです。一部のテスト フレームワークではイベントのトリガーをシミュレートできますが、実際には、これはテストへの最良のアプローチではありません。関数コードを呼び出す最良の方法は、単一の関数呼び出しを使用することです。

アプリケーション ロジックとイベント処理コードを常に分離する必要があります。前述のコード例をリファクタリングする場合、最初のステップは、ポップアップ ボックスのロジックを処理するコードを別の関数に入れることです。この関数は、アプリケーションに定義されたグローバル オブジェクトにマウントされる可能性があります。イベント ハンドラーは常に同じグローバル オブジェクト内に存在する必要があるため、2 つのメソッドがあります。

// 好的写法 - 拆分应用逻辑var MyApplication = {  handleClick: function (event) {    this.showPopup(event);
  },  showPopup: function (event) {    var pop = document.getElementById('popup');
    popup.style.left = event.clientX + 'px';
    popup.style.top = event.clientY + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
ログイン後にコピー

これまでイベント ハンドラーに含まれていたすべてのアプリケーション ロジックは、MyApplication.showPopup() メソッドに移動されました。現在、MyApplication.handleClick() メソッドは、MyApplication.showPopup() を呼び出すという 1 つのことだけを実行します。アプリケーション ロジックが取り除かれると、同じ機能コードへの呼び出しが複数のポイントで発生する可能性があり、特定のイベントのトリガーに依存する必要がなくなり、明らかに便利になります。ただし、これはイベント ハンドラー コードを分解するための最初のステップにすぎません。

ルール 2: イベント オブジェクトを配布しない

アプリケーション ロジックを削除した後も、上記のコード例には問題がまだ残っています。つまり、イベント オブジェクトが制御不能に配布されます。匿名イベント ハンドラーから MyApplication.handleClick() を渡し、匿名イベント ハンドラーはそれを MyApplication.showPopup() に渡します。前述したように、イベント オブジェクトにはイベントに関連する多くの追加情報が含まれており、このコードではそのうちの 2 つだけを使用します。アプリケーション ロジックは、次の理由により、関数を正しく完了するためにイベント オブジェクトに依存すべきではありません:

メソッド インターフェイスは、どのデータが必要であるかを示しません。優れた API は、期待と依存関係について透過的でなければなりません。イベント オブジェクトをパラメーターとして取得しても、イベントのどのプロパティが役立つのか、またそれらが何に使用されるのかがわかりません

したがって、このメソッドをテストしたい場合は、イベント オブジェクトを再作成してパラメーターとして渡す必要があります。 。したがって、テスト コードを正しく作成するには、このメソッドがどのような情報を使用するかを正確に知る必要があります。

これらの問題 (不明瞭なインターフェイス形式やテスト用の自己構築イベント オブジェクトを指す) は、大規模な Web アプリケーションではお勧めできません。コードが明確でないとバグが発生する可能性があります。

最善の方法は、イベント ハンドラーにイベント オブジェクトを使用してイベントを処理させ、必要なデータをすべて取得してアプリケーション ロジックに渡すことです。たとえば、MyApplication.showPopup() メソッドには、x 座標と y 座標の 2 つのデータのみが必要です。このようにして、これら 2 つのパラメーターを受け取るようにメソッドを書き直します。

// 好的写法var MyApplication = {  handleClick: function (event) {    this.showPopup(event.clientX, event.clientY);
  },  showPopup: function (x, y) {    var pop = document.getElementById('popup');
    popup.style.left = x + 'px';
    popup.style.top = y + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
ログイン後にコピー

在这段新重写的代码中,MyApplication.handleClick()将x坐标和y坐标传入了MyApplication.showPopup(),代替了之前传入的事件对象。可以很清晰地看到MyApplication.showPopup()所期望传入的参数,并且在测试或代码的任意位置都可以很轻易地直接调用这段逻辑,比如:

// 这样调用非常棒MyApplication.showPopup(10, 10);

当处理事件时,最好让事件处理程序成为接触到event对象的唯一的函数。事件处理程序应当在进入应用逻辑之前针对event对象执行任何必要的操作,包括阻止默认事件或阻止事件冒泡,都应当直接包含在事件处理程序中。比如:

// 好的写法var MyApplication = {  handleClick: function (event) {    // 假设事件支持DOM Level2
    event.preventDefault();
    event.stopPropagation();    // 传入应用逻辑
    this.showPopup(event.clientX, event.clientY);
  },  showPopup: function (x, y) {    var pop = document.getElementById('popup');
    popup.style.left = x + 'px';
    popup.style.top = y + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
ログイン後にコピー

在这段代码中,MyApplication.handleClick()是事件处理程序,因此它在将数据传入应用逻辑之前调用了event.preventDefault()和event.stopPropagation(),这清除地展示了事件处理程序和应用逻辑之间的分工。因为应用逻辑不需要对event产生依赖,进而在很多地方都可以轻松地使用相同的业务逻辑,包括写测试代码。

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

推荐阅读:

怎样利用JS做出引用传递与值传递

如何做出node.js界面

以上がWeb開発におけるイベント処理ルールとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python+Flaskを使ってWebページのログのリアルタイム更新・表示を実現する方法 Python+Flaskを使ってWebページのログのリアルタイム更新・表示を実現する方法 May 17, 2023 am 11:07 AM

1. module を使用したファイルへのログ出力:logging はカスタム レベルのログを生成し、指定したパスにログを出力できます ログ レベル: debug (デバッグ ログ) = 5) {clearTimeout (time) // すべての結果が取得された場合 10連続した時間が空です スケジュールされたタスクのログをクリアします}return}if(data.log_type==2){//新しいログが取得された場合 for(i=0;i

Nginx Webサーバーキャディの使用方法 Nginx Webサーバーキャディの使用方法 May 30, 2023 pm 12:19 PM

Caddy の概要 Caddy は強力で拡張性の高い Web サーバーであり、現在 Github 上に 38,000 以上のスターが付いています。 Caddy は Go 言語で書かれており、静的リソースのホスティングとリバース プロキシに使用できます。 Caddy には以下の主な特徴があります: Nginx の複雑な構成と比較して、元の Caddyfile 構成は非常にシンプルです; 提供する AdminAPI を通じて構成を動的に変更できます; デフォルトで自動 HTTPS 構成をサポートし、自動的に適用して構成できますHTTPS 証明書; 数万のサイトのデータに拡張可能; 追加の依存関係なしでどこでも実行可能; Go 言語で記述されているため、メモリの安全性がより保証されます。まずはCentOに直接インストールします

Java API開発におけるWebサーバー処理にJetty7を使用する Java API開発におけるWebサーバー処理にJetty7を使用する Jun 18, 2023 am 10:42 AM

JavaAPI 開発における Web サーバー処理に Jetty7 を使用する インターネットの発展に伴い、Web サーバーはアプリケーション開発の中核部分となり、多くの企業でも注目を集めています。増大するビジネス ニーズを満たすために、多くの開発者が Web サーバー開発に Jetty の使用を選択しており、その柔軟性と拡張性は広く認識されています。この記事では、JavaAPI 開発における Jetty7 の使用方法を紹介します。

どのゲームが i34150 および 1G 独立グラフィックスでのプレイに適していますか (どのゲームが i34150 に適していますか) どのゲームが i34150 および 1G 独立グラフィックスでのプレイに適していますか (どのゲームが i34150 に適していますか) Jan 05, 2024 pm 08:24 PM

1G 独立グラフィックスを備えた i34150 ではどのようなゲームをプレイできますか? LoL などの小さなゲームもプレイできますか? GTX750 および GTX750TI は、グラフィックス カードの選択肢として非常に適しています。小規模なゲームをプレイするだけの場合、またはゲームをプレイしない場合は、i34150 統合グラフィックス カードを使用することをお勧めします。一般に、グラフィックス カードとプロセッサーの価格差はそれほど大きくないため、合理的な組み合わせを選択することが重要です。 2G のビデオ メモリが必要な場合は、GTX750TI を選択することをお勧めします。1G のビデオ メモリのみが必要な場合は、GTX750 を選択してください。 GTX750TI は、オーバークロック機能を備えた GTX750 の強化版と見なされます。どのグラフィックス カードを i34150 と組み合わせることができるかはニーズによって異なります。スタンドアロン ゲームをプレイする予定がある場合は、グラフィックス カードの変更を検討することをお勧めします。選んでいいですよ

ウェブ上の顔面ブロック攻撃に対するリアルタイム保護 (機械学習に基づく) ウェブ上の顔面ブロック攻撃に対するリアルタイム保護 (機械学習に基づく) Jun 10, 2023 pm 01:03 PM

顔面遮蔽弾幕とは、映像内の人物を遮ることなく大量の弾幕が浮遊し、人物の背後から浮遊しているように見せることです。機械学習は数年前から普及していますが、これらの機能がブラウザでも実行できることは多くの人に知られていません。この記事では、ビデオ連発における実際的な最適化プロセスを紹介します。記事の最後に、適用可能なシナリオをいくつか示します。このソリューションを開くことを望んでいます。いくつかのアイデアがあります。 mediapipeDemo (https://google.github.io/mediapipe/) は、顔ブロック弾幕のオンデマンドアップアップロードの主流の実装原理を示していますサーバーのバックグラウンド計算により、ビデオ画面内のポートレート領域を抽出し、SVG ストレージに変換しますクライアントがビデオを再生している間、サーバーから SVG をダウンロードし、弾幕、ポートレートと組み合わせる

FRPS サーバーと Web がポート 80 を共有するように nginx を設定する方法 FRPS サーバーと Web がポート 80 を共有するように nginx を設定する方法 Jun 03, 2023 am 08:19 AM

まず、frpって何?という疑問があると思います。簡単に言うと、frp はイントラネット侵入ツールであり、クライアントを設定すると、サーバー経由でイントラネットにアクセスできるようになります。現在、私のサーバーは Web サイトとして nginx を使用しており、ポート 80 が 1 つだけあります。では、FRP サーバーもポート 80 を使用したい場合はどうすればよいでしょうか?クエリ後、nginx のリバース プロキシを使用してこれを実現できます。追加: frps はサーバー、frpc はクライアントです。ステップ 1: サーバーの nginx.conf 構成ファイルを変更し、次のパラメータを nginx.conf の http{} に追加します。server{listen80

Golang を使用して Web アプリケーションのフォーム検証を実装する方法 Golang を使用して Web アプリケーションのフォーム検証を実装する方法 Jun 24, 2023 am 09:08 AM

フォーム検証は Web アプリケーション開発において非常に重要なリンクであり、フォーム データを送信する前にデータの有効性をチェックして、アプリケーションのセキュリティ脆弱性やデータ エラーを回避できます。 Web アプリケーションのフォーム検証は、Golang を使用すると簡単に実装できます。この記事では、Golang を使用して Web アプリケーションのフォーム検証を実装する方法を紹介します。 1. フォーム検証の基本要素 フォーム検証の実装方法を紹介する前に、フォーム検証の基本要素が何であるかを知る必要があります。フォーム要素: フォーム要素は

コックピット Web UI から管理アクセスを有効にする方法 コックピット Web UI から管理アクセスを有効にする方法 Mar 20, 2024 pm 06:56 PM

Cockpit は、Linux サーバー用の Web ベースのグラフィカル インターフェイスです。これは主に、初心者/熟練ユーザーにとって Linux サーバーの管理を容易にすることを目的としています。この記事では、Cockpit アクセス モードと、CockpitWebUI から Cockpit への管理アクセスを切り替える方法について説明します。コンテンツ トピック: コックピット エントリ モード 現在のコックピット アクセス モードの確認 CockpitWebUI からコックピットへの管理アクセスを有効にする CockpitWebUI からコックピットへの管理アクセスを無効にする まとめ コックピット エントリ モード コックピットには 2 つのアクセス モードがあります。 制限付きアクセス: これは、コックピット アクセス モードのデフォルトです。このアクセス モードでは、コックピットから Web ユーザーにアクセスできません。

See all articles