iframeノードの初期化の問題に関する議論

iframeノードの初期化の問題に関する議論
今日、ふとリッチテキストエディタの制作原理を見直してみようと思いました。それで、彼は何も言わずにそれをやり始めました。 1 年前にシンプルなリッチ テキスト エディターを作成したので、その印象がまだ残っています。しかし、書いたコードを実行すると、問題が見つかりました。

コードをコピー
コードは次のとおりです。

var ifr = document.createElement('iframe');
幅 = 300;
ifr.高さ = 300;
var idoc = ifr.contentDocument || ifr.contentWindow.document;
idoc.designMode = 'オン';
コンテンツ編集可能 = true;
idoc.write('<html><head><style>body{ margin:0px; }</style></head><body></body></html>');
ドキュメント本体に子要素を追加します(ifr);

上記のコードを見て、何か抜けているところを見つけましたか?

私と同じような経験をした友人がいなかったら、おそらくこのコードの何が間違っているのか分からないと思います。それなら、走りに行ってみたらいいでしょう。すぐに問題が見つかるかもしれません。

以下に答えを明らかにします:

オブジェクトが見つからない場合、このコードは例外をスローします。見つからないオブジェクトはどれですか?ドキュメント オブジェクトが見つかりません。どうしたらいいですか?ドキュメント オブジェクトが見つからないのはなぜでしょうか?もちろん、このドキュメント オブジェクトは iframe のドキュメント オブジェクトです。リッチ テキストを扱ったことがある人なら誰でも、iframe を編集可能に設定する前に、まず iframe のドキュメント オブジェクトを取得する必要があることを知っています。しかし、なぜドキュメント オブジェクトを取得できないのでしょうか?ここであなたを不安にさせるつもりはありません。私の解決プロセスについてお話ししましょう。

まず Google にアクセスして、文書の入手方法が正しいことを確認しました。それで、それは Chrome のせいなのかなと思いました。 Chrome がこれら 2 つのオブジェクトをサポートしていない可能性はありますか?そこでFirefoxに切り替えました。結果は同じです。そうすると、問題はあなた自身のコードにあることは間違いありません。

その後、インターネット上のコードと比較したところ、appendChild の位置が少し間違っていることがわかったので、ドキュメント オブジェクトを取得する前にそれを前方に移動しました。

コードをコピー
コードは次のとおりです。

var ifr = document.createElement('iframe');
幅 = 300;
ifr.高さ = 300;
ドキュメント本体に子要素を追加します(ifr);
var idoc = ifr.contentDocument || ifr.contentWindow.document;
idoc.designMode = 'オン';
コンテンツ編集可能 = true;
idoc.write('<html><head><style>body{ margin:3px; word-wrap:break-word; word-break: break-all; }</style></head><body></body></html>');

その結果、すべてがスムーズに進みました。次にエラーを分析しました。実際、このエラーの背後にある原理は非常に単純です。 iframe には実際には別のドキュメントが含まれており、このドキュメントは初期化された後にのみドキュメント オブジェクトを持つことができることは誰もが知っています。 iframe 要素が DOM ツリーに追加されない場合、iframe 内のドキュメントは初期化されません。したがって、コードの先頭では、ifr 変数で取得した contentDocument 値は null であり、これは iframe 内のドキュメントがこの時点では初期化されていないことを意味します。

この行に従って、他のノードの初期化をチェックしたところ、他の要素ノードが作成されると、DOM ツリーに追加されるかどうかに関係なく、独自のプロパティとメソッドを持つことがわかりました。つまり、iframe は多くの要素ノードの中で外れ値です。

<<:  CSS3 カスタムスクロールバースタイル::webkit-scrollbar サンプルコード詳細説明

>>:  MySQLフィールド定義でnullを使用しない理由の分析

推薦する

Vue でコミュニケーションを実装する 8 つの方法

目次1. コンポーネント通信1. Props 親コンポーネント ---> 子コンポーネント通信...

InnoDB エンジンのパフォーマンスを最適化するための my.cnf パラメータ構成

私はインターネット上で数え切れないほどの my.cnf 構成を読みましたが、言及されている構成のほと...

プライベートレジストリ内の画像を照会または取得する方法

Dockerはプライベートレジストリ内のイメージを照会または取得するために、 docker 検索 1...

スライダー検証コードを実装するJavaScript

この記事では、スライダー検証コードを実装するためのJavaScriptの具体的なコードを参考までに共...

HTMLはBaidu百科事典のナビゲーションドロップダウンメニュー機能を模倣します

HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...

Docker で Maven プロジェクトをより速くビルドする

目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....

Linux lessコマンド例の詳細な説明

ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...

テキストエリアの disabled 属性と readonly 属性の具体的な使用法

障害者の定義と使用法disabled 属性はブール属性です。 disabled 属性は、テキスト領域...

JavaScript ES6 モジュールの詳細な説明

目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

以前は、フロートはレイアウトによく使用されていましたが、フローティングレイアウトを使用すると親要素の...

Linux でローカル コンピューターとリモート サーバーのポートが接続されているかどうかを確認する方法

以下のように表示されます。 1. ssh -v -p [ポート番号] [ユーザー名]@[IPアドレス...

jQueryはフォントサイズ調整ケースを実装します

この記事では、フォントサイズを調整するためのjQueryの具体的なコードを参考までに紹介します。具体...

Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...

実行中のDockerコンテナのポートマッピングを変更する方法

序文docker run がコンテナを作成して実行するときに、-p を使用してポート マッピング ル...