HTMLのシリアライズ

それでは、適切なWebアプリケーションでHTMLをシリアル化に注意を向ける、いくつかしているに直面して制約の問題のいくつかの特定のDOMプロパティを示す一貫性のない行動を回避innerHTMLのinnerHTMLプロパティの目的の作業を聞かせ、子を抽出することです文字列形式でのHTML要素の要素。問題は、innerHTMLプロパティを適切なテキストを生成することはありません。する。理論この問題を回避する場所のinnerHTMLプロパティが失敗を理解するために、いくつかの例を介して作業を段階的にどこに問題がある表示させる必要があります。が示される例では、ボタンとテキストフィールドを動的に追加されます。たとえば、ソースコードを次のとおりです。

 ソース: /サイト/ルート/ Ajaxの記事/ DHTMLビューア/ inconsistent.html 一貫性がない。innerHTML 

  

関数DOMInsertedボタンをクリックし、IDを持つdiv要素にテキストを追加dynamicallyinserted。 dynamicallyinserted ID番号の子要素があります。したがって、innerHTML呼ばれ、返される文字列のテキストが含まれるだろうとdiv要素のときのユーザーを動的に、この関数はDOMInsertedと呼ばれる挿入]ボタンを押します。いずれかのボタンやテキストボックスを作成するのと同じHTML要素に入力します。どのようなテキストボックスからボタンを区別するプロパティの型の値です。 input要素のインスタンスを作成するには、メソッドのdocument.createElementを使用します。一度要素のインスタンスがインスタンス化され、割り当てられた場合は、div要素のappendChildメソッドを使用して追加します。

後に、両方の入力のインスタンスには、div要素に追加されている場合、innerHTML、HTMLで、その子要素の値を取得するために使用することができます。 innerHTMLの値は、textarea要素には、生のHTMLの値を示すために割り当てられている。このエラーは、値がない属性が存在しています。これは、スクリプトに割り当てられると、HTMLで表示される実際には、value属性は、存在しませんが、innerHTMLプロパティを尊重し、値の属性は、Internet Explorerが存在しない場合、正しい出力を生成します。 Operaには、同じコードを実行するMozillaのように同じエラーが生成されます。 DHTMLのユーザーインターフェイスのため、すべての変更をユーザーまたはスクリプトによって作ら動的である必要があるプロパティに反映される。ソリューションは、この資料の残りの部分では、HTML要素のシリアル化の問題を解決するために焦点を当てます。解決策は、内のバッファを生成するため、単純な場合は、個別にすべての要素を反復処理するため、長いバッファを生成する必要があります。次のコードでは、完全なソリューションを示しています。

 ソース: 

関数を再帰および個々の要素を反復処理するため、すべてのブラウザを使用することができます使用されます。再帰的な関数は、プロパティとメソッドのためにイントロスペクトされるオブジェクトのインスタンスを表す1つのパラメータがあります。シリアルのみのノード(element.nodeType):1と3の2つのタイプをサポートします。場合は、様々なノードの種類が何であるか、その数字の1と3を知らないお手伝いをするつもりはありません。ノードタイプ1、およびノードタイプ3プレーンバニラのHTML要素を表すテキストの一部を表します。ため、一般的に、彼らは、シリアル化することが重要ではないに言えば、シリアル化、およびように、コメント、pageディレクティブは無視されます場合は、ノードのタイプ1の場合、バッファは、要素の識別子と関連するすべての属性に対して生成されます。あなたはすべての属性を反復処理する属性の値が含まれると思うだろう。任意のブラウザは、Internet Explorerは、element.attributes配列内に存在している属性以外の属性の型に依存します。

input要素のタイプに応じて、属性の値のリストの一部は、アクセスされていないという意味ではないかもしれません。また、それを直接表記element.valueを使用して参照する必要があるということです。実際には、いくつかの要素が表示され、他ではない、少し気になるが、これは、ブラウザをどのように隠れているという疑問が残るしています。場合は密接にソースコードと矛盾するHTMLページの生成された出力を見ると、ブラウザを1つの一貫性のない属性を処理している:彼らは、動的に生成さbutton要素のonclickハンドラが欠落していることがわかります。 onclick属性を静的に定義されたボタンが、動的に生成されたボタンではなく、生成されます。

場合は、イベントハンドラは、HTMLシリアル化され生成したいなら、自問する必要があります。ない場合は回答の場合は、属性の文字で始まるをテストしてイベントをチェックする関数htmlSerialize 図書館 および Ñ。しかし、そのイベントをシリアル化するが正しいですか? 1つの場合は、HTMLのシリアル化するつもりだが、すべてをシリアル化する必要があると主張することができます。ただし、シリアル化するすべての困難ですが、これを何らかの方法で関数の参照を格納する必要があります。ため、属性の行を含めることはできませんこの属性では、関数の実装を格納することはできませんフィード。あなたの決断何が最も可能性が高いHTMLのシリアル化を行う場合は、に基づいている必要がありますし、その状態に解凍されます。提案するソリューションは、完全なものではないが、それは特定のコンテキストを解決し、それを実現するために必要なものです。ときに、関数リファレンスの直列化の問題の解決は、どのように動的に割り当てられている関数は、たとえば、HTMLページに示すようにシリアル化するための質問です。しかしすばやく機能は、シリアル化が表示されますイラスト目的のための機能の最初のシリアル化と、より複雑になることができます。関数をシリアル化するには、として機能htmlSerializeリライトしたい次のとおり:

htmlSerialize:(要素)関数( ヴァールはScriptBuffer ="";ヴァール再帰的=関数(要素)(ヴァールバッファ="";場合(element.nodeType == 1)(バッファ+ ="""+ element.nodeName +"";ヴァールdidGenerateValue =偽;用(ヴァール= 0;私は"element.attributes.length;私+ +)= element.attributes(ヴァールAttrを[私];ヴァール名= attr.name.toLowerCase(); 場合(name.charAt(0)=='o'は&name.charAt(1)=='ñ')( 場合は(()=="文字列")attr.value typeof演算( バッファ+ = attr.name +"= \""+ attr.value +"\"";  他の場合(attr.value!=がnull&&!(typeof演算(attr.value)=="文字列"&attr.value.length == 0))(場合(新しい文字列(要素[attr.name])。toLowerCase( )==""未定義)(バッファ+ = attr.name +"= \""+ attr.value +"\"";)他(バッファ+ = attr.name +"= \""+要素[Attrを。名] +"\"";))の場合(attr.name.toLowerCase()=="値")(didGenerateValue =がtrue;))の場合(element.nodeName.toLowerCase()=="入力"&&!didGenerateValue) (バッファ+ ="値= \""+ element.value +"\"";) (方法element.onclick)の場合( はScriptBuffer + ="変数"+ element.id +"_onclick ="+ 方法element.onclick; バッファ+ ="値= \""+ element.id +"_onclick()\""; バッファ+ =""";場合(element.nodeName.toLowerCase()=="テキストエリア")(バッファ+ = element.value;)他(用(ヴァール= 0;私は"element.childNodes.length;私+ +)(バッファ+ =再帰的な(element.childNodes [私]);))バッファ+ ="  ";)以外の場合(element.nodeType == 3)(バッファ+ = element.nodeValue;)リターンバッファ;)ヴァールバッファ=""(ヴァール= 0;私は"element.childNodes.length;私+ +用) (バッファ+ =再帰的な(element.childNodes [私]);)リターンバッファ;)

変更の実装に太字のコードは、イベントハンドラのシリアル化に関連します。太字のコードの最初の部分は、スクリプトのバッファの宣言です。スクリプトバッファ場合は、シリアル化されたHTMLで保存したスクリプトのコードです。のようにスクリプトのコードを動的にするときにシリアル化されたHTMLをinnerHTMLプロパティを使用して割り当てること自体が付加される場合、両方のピースが必要です。2番目の太字のコードをデザイン時に宣言されたイベントは、シリアル化されます。場合は、要素を動的にし、すべての関連するイベントがシリアライズされていない添付されます。太字のコードの最後の3つ目の問題で、微妙なコードです。たとえば、HTMLページでは、onclickイベントを動的にボタンを動的に注入された割り当てられていた。onclickイベントを文字列は、別のコールを参照できませんでした。 onclickイベントは、匿名のJavaScript関数を参照しました。ため、シリアル化された属性の完全な機能の実装を含めることができない場合は、関数をシリアル化する必要がありますと、この関数は、デザイン時のHTML要素の宣言は、直列に似たへの参照を作成します。動的に関連付けられてonclickイベント匿名関数、およびしたがってはありません識別子があります。太字のコードは、要素のidを連結し、onclickイベントをされている関数を定義します。しかし動的な例ではidには、複数の同一のonclickイベントが生成される予定だ。また、その後は、ランダムな識別子は、シリアル化されたHTML形式で参照するランダムな識別子を生成することができます。

ランダムな識別子は、関数識別子の問題を解決します。しかし、今は2つのバッファされます。 1つのバッファ、およびシリアル化されたHTMLコードを含む別のバッファは、スクリプトでは、これには、関数の参照エラーは生成されません実行する必要が含まれています。ご覧のように、コードは現在、非常に複雑になり、壊れ始めている。これはなぜ私のイベントをしない限り絶対に必要なシリアル化しないことをお勧めします。以下の点については、このHTMLシリアライゼーション記事に関する注意:

•HTMLのシリアル化の詳細については、例外を除いて、はらんでいると小さな問題です。たとえば、htmlSerializeを使用してシリアル化、IEの場合は、定義していない属性がどっさり生成されます。このデフォルトのためにされ、さらに難しく、一部のHTMLを抽出することができます。あなたは、スタイルシートがデフォルトで管理していると仮定してください。

•ときは、一般的なソリューションを信頼していないHTMLのシリアル化を実装する。信託固有のソリューションは、特定のコンテキスト内で特定の問題を解決します。

•[プロパティ]をsetAttributeメソッドで割り当てる、両方のブラウザには、innerHTMLプロパティを使用して表示されます。

•日時のHTMLコンテンツの場合は、ブラウザから[保存]を使用して保存するとして、一貫して全てのブラウザに保存されません。

•第2条どのようにJavaScriptのオブジェクトをシリアル化する、としたこの資料では、DHTMLビューアをシリアル化する方法を示しました。シリアル化の各タイプのユニークな目的のために特定のシリアル化されます。これらの詳細を知っておくと、適切なシリアル化を選択する必要があります。

記事は、ソニアLandeを提出


免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。
重要: この記事は、"HTML"の自動ソフトウェアによって翻訳されたシリアル化。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。


Online: 322 users browsing the articles directory