JavaScript でクロスブラウザ イベント処理メカニズムを作成 [Blue-Dream 制作]_javascript スキル
互換性の問題はクラス ライブラリを使用すると簡単に解決できますが、そのメカニズムについて少しずつ説明していきます。
まず、DOM Level2 はイベント処理用の 2 つの関数
addEventListener と removeEventListener を定義します。どちらも EventTarget インターフェースからのものです。 🎜>
EventTarget インターフェイスは通常、Node または Window インターフェイスから実装されます。
たとえば、次のようになります。
コードをコピー
削除中リスナーは、removeEventListener を使用して簡単に実行できます。削除されたハンドルと追加されたハンドルが関数を参照していることに注意してください。
完璧な世界では、関数はここで終了します。
そのため、実際に行う必要があるのは、IE ブラウザと w3c 標準間のイベント処理の違いに対処することです。
モニタリングを追加し、リスナーを削除するには、次のように記述します。
コードをコピー
表面から、IE と w3c の間に 2 つの違いがあることがわかります。
1 の前に「on」プレフィックスがあります。
2. useCapture の 3 番目のパラメーターは削除されました。
実際には、これら 2 つの違いについてはさらに分析していきます。共通関数
コードをコピー
}
else {
element['on' イベント名] = ハンドラー;
}
}
関数 RemoveListener(要素, イベント名, ハンドラー) {
if (element.addEventListener) {
element.removeEventListener(eventName, handler, false);
}
else if (element.detachEvent) {
element.detachEvent('on'
}
else {
element['on'eventName] = null;
注意すべき点が 2 つあります。上記の関数について:
1. まず、IE が徐々に標準に近づいているため、最初にこのブランチの w3c 標準を測定するのが最善です。
2.
パフォーマンスの最適化
上記の関数では、各バインディング イベントにはブランチが必要です。
このように、事前に検出するために「実行前」に変更する必要があります。 document.body を使用しない理由は、ドキュメントの準備ができていないときに document.body がすでに存在しているためです。
コードをコピー
コードは次のとおりです:
var addListener, RemoveListener,
/* テスト要素 */
docEl = document.documentElement;
// addListener
if (docEl.addEventListener) {
/* `addEventListener` がテスト要素に存在する場合、`addEventListener` を使用する関数を定義 */
addListener = function (element,eventName, handler) {
element.addEventListener(eventName, handler, false);
};
}
else if (docEl.attachEvent) {
/* `attachEvent` がテスト要素に存在する場合、`attachEvent` を使用する関数を定義 */
addListener = function (要素, イベント名, ハンドラー) {
element.attachEvent('on' イベント名, ハンドラー);
};
}
else {
/* どちらのメソッドもテスト要素に存在しない場合は、フォールバック戦略に関数を定義します */
addListener = function (element,eventName,handler) {
element['on ' イベント名] = ハンドラー;
};
}
//removeListener
if (docEl.removeEventListener) {
removeListener = function (element,eventName, handler) {
element.removeEventListener(eventName, handler, false);
};
}
else if (docEl.detachEvent) {
removeListener = function (要素, イベント名, ハンドラー) {
要素.detachEvent('on' イベント名, ハンドラー);
};
}
else {
removeListener = function (要素, イベント名, ハンドラー) {
要素['on' イベント名] = null;
};
}
これは回避済每次绑定都判断が必要です。
上の利点は、これにも 2 つのハードコードがあります。 代コード量の増加を除いて、ある点はハードウェア推测を使用していることです。これは安全ではありません。
不安全な检测
下の二つの例文説明。ある状況下ではこれは十分安全ではありません。
// Internet Explorer の場合
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
if (xhr.open) { } // エラー
var element = document.createElement('p');
if (element.offsetParent) { } // エラー
例: IE7 下の typeof xhr.open === 'unknown'。 详细参考feature-detection
所以我们提倡の检测方式は
var isHostMethod = function (オブジェクト, メソッド名) {
var t = オブジェクトの種類[メソッド名];
return ((t === '関数' || t === 'オブジェクト') && !!オブジェクト[メソッド名]) || t === '不明';
};
この样我们上の优化関数。再次改进成この样
var addListener, docEl = document.documentElement;
if (isHostMethod(docEl, 'addEventListener')) {
/* ... */
}
else if (isHostMethod(docEl, 'attachEvent')) {
/* ... */
}
else {
/* ... */
}
失われたこの指针
この指针の处理.IE w3c との違いは、w3c の関数の指示は、その句柄を決定する DOM 要素を指示することです。 而IE下破总はウィンドウを指します。
// IE
document.body.attachEvent( 'onclick', function () {
alert(this === window) // true
alert(this === document.body) // false
});
// W3C
document.body.addEventListener('onclick', function () {
alert(this === window); // false
alert(this === document.body) ); // true
});
这个问题修正起来也不算麻烦
if (isHostMethod(docEl, 'addEventListener')) {
/* ... */
}
else if (isHostMethod(docEl, 'attachEvent')) {
addListener = function (element, イベント名, handler) {
element.attachEvent('on' イベント名, function () {
handler.call(element, window.event);
});
};
}
else {
/* ... */
}
その後、呼び出しを使用してハンドラーのポインターを内部的に修正するだけです。実際、ここで密かに修正された問題があることに誰もが気づいているはずです。は最初の関数を通過せず、グローバルな世界に残されます。そのため、ここでも次のような大きな問題を修正しました。しばらく停止して簡単なテストを行うことができます。
1. ブラウザー間の互換性 2. このポインターが指す互換性
テストコードは次のとおりです:

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Python GUIプログラミングの簡単な紹介 GUI (Graphical User Interface、グラフィカル ユーザー インターフェイス) は、ユーザーがコンピュータとグラフィカルに対話できるようにする方法です。 GUI プログラミングとは、プログラミング言語を使用してグラフィカル ユーザー インターフェイスを作成することを指します。 Python は、豊富な GUI ライブラリを提供する人気のプログラミング言語であり、Python GUI プログラミングを非常に簡単にします。 Python GUI ライブラリの概要 Python には多くの GUI ライブラリがあり、最も一般的に使用されるものは次のとおりです: Tkinter: Tkinter は、Python 標準ライブラリに付属する GUI ライブラリで、シンプルで使いやすいですが、機能が限られています。 PyQt: PyQt は、強力な機能を備えたクロスプラットフォーム GUI ライブラリです。

はじめに CircularQueue は線形キューを改良したもので、線形キューのメモリ浪費の問題を解決するために導入されました。循環キューは、FIFO 原理を使用して要素を挿入および削除します。このチュートリアルでは、循環キューの操作とその管理方法について説明します。循環キューとは何ですか?循環キューは、フロントエンドとバックエンドが相互に接続されたデータ構造の別のタイプのキューです。循環バッファとも呼ばれます。これは線形キューと同様に動作しますが、なぜデータ構造に新しいキューを導入する必要があるのでしょうか?線形キューを使用する場合、キューがその上限に達すると、末尾ポインターの前にいくらかのメモリ領域が存在する可能性があります。これによりメモリの損失が発生するため、優れたアルゴリズムではリソースを最大限に活用できる必要があります。メモリの無駄を解決するには

PHP8.0 のイベント処理ライブラリ: Event インターネットの継続的な発展に伴い、PHP は人気のバックエンド プログラミング言語として、さまざまな Web アプリケーションの開発に広く使用されています。このプロセスでは、イベント駆動のメカニズムが非常に重要な部分になっています。 PHP8.0 のイベント処理ライブラリ Event は、より効率的で柔軟なイベント処理メソッドを提供します。イベント処理とは何ですか? イベント処理は、Web アプリケーションの開発において非常に重要な概念です。イベントは任意の種類のユーザー行にすることができます

バブリング イベントとは、Web 開発において、要素でイベントがトリガーされると、イベントがドキュメント ルート要素に到達するまで上位の要素に伝播することを意味します。この伝播方法は、泡が下から徐々に上昇していくようなものであるため、バブリングイベントと呼ばれます。実際の開発では、イベントを正しく処理するために、バブリング イベントがどのように機能するかを知り、理解することが非常に重要です。以下では、バブリングイベントの概念と使用法を、具体的なコード例を通して詳しく紹介します。まず、親要素と 3 つの子要素を持つ単純な HTML ページを作成します。

Vue では、多くの場合、ネストされたコンポーネントがいくつかあり、これらのネストされたコンポーネント間でイベントを渡す必要があります。 Vue では、$emit イベントはコンポーネント間のイベント通信に使用されます。ただし、場合によっては、親コンポーネントのイベント ハンドラーをネストされた子コンポーネントに渡す必要がある場合、$emit イベントの使用は適切ではありません。このとき、Vue が提供する $listeners を使用してイベント処理関数を渡すことができます。それで、$listener とは何ですか?

Vue の v-on ディレクティブの分析: フォーム送信イベントの処理方法 Vue.js では、v-on ディレクティブはイベント リスナーをバインドするために使用され、さまざまな DOM イベントをキャプチャして処理できます。その中でも、フォーム送信イベントの処理は Vue の一般的な操作の 1 つです。この記事では、v-on ディレクティブを使用してフォーム送信イベントを処理する方法を紹介し、具体的なコード例を示します。まず、Vue のフォーム送信イベントとは、ユーザーが送信ボタンをクリックするか Enter キーを押したときにトリガーされるイベントを指すことを明確にする必要があります。 Vue では、次のように渡すことができます。

ブレイン マップ機能における PHP と Vue のキー コード実装の詳細な検討 概要: この記事では、マインド マップ機能の実現における PHP と Vue のキー コード実装について詳しく説明します。ブレイン マッピングは、思考構造や関係性を表示するために一般的に使用されるグラフィカル ツールで、プロジェクト計画、知識管理、情報整理などの分野で広く使用されています。 PHP と Vue の関連知識を学ぶことで、シンプルかつ強力な脳マッピング アプリケーションを実装できます。 PHPPHP は一般的に使用されるサーバー側スクリプト言語であることを理解します。習得が簡単で拡張性が高い

イベント バブリングのアプリケーション シナリオと、それがサポートするイベントの種類 イベント バブリングとは、要素上のイベントがトリガーされると、イベントがその要素の親要素に渡され、その後要素の祖先要素に渡されることを意味します。ドキュメントのルート ノードに渡されます。これはイベント モデルの重要なメカニズムであり、幅広い応用シナリオがあります。この記事では、イベント バブリングのアプリケーション シナリオを紹介し、イベント バブリングがサポートするイベントの種類について説明します。 1. アプリケーション シナリオ イベント バブリングには、Web 開発における幅広いアプリケーション シナリオがあります。ここでは、一般的なアプリケーション シナリオをいくつか紹介します。フォーム内でのフォーム検証
