私も、クライアント側の HTML 作成ロジックを使用した JSON 応答を好みます。
残念ながら、実際のクライアント側の HTML 書き込みスクリプトのほとんどは破損しており、クロスサイト スクリプティングのセキュリティ ホールになりやすい HTML インジェクションの欠陥が多数含まれています。敵対的なユーザーと直接話すのではなく、自分のサーバーと話しているので、どういうわけか「安全」であり、文字列を HTML に補間するときに正しく文字列がなくても逃げることができるという信念があると思います。これはもちろんナンセンスです。
私はいつも次のようなものを見ます:
$('#mydiv').append('<em>Deleted '+response.title+'!</em>');
また:
mydiv.innerHTML= '<p>Renamed to '+response.name+'</p>;
または実際には、デフォルトで行われる HTML エスケープがない Resig のマイクロテンプレート ハックです。さあ、みんな!サーバー側の XSS を提供する壊れた PHP スクリプトのレガシーのクリーンアップを開始したばかりですが、クライアント側の XSS エクスプロイトのまったく新しい大規模な範囲を導入したいとお考えですか?
はぁ。それがルアーオブストリングスです。私たちはそれらを理解していると思います。しかし、文字列は危険であり、コンテキストが隠され、要件を回避します。クライアント側で HTML を生成する必要がある場合は、次のような関数が必要になります。
function h(s) {
return s.split('&').join('&').split('<').join('<').split('"').join('"');
}
mydiv.innerHTML= '<p>Renamed to '+h(response.name)+'</p>;
でも個人的にはDOMメソッドの方が好きです。SQL のパラメータ化と同様に、DOM メソッドを使用すると、生の文字列をコンポーネントに直接伝えることで、式から文字列のスリングを取り除くことができます。OK、DOM の問題は、かなり冗長なことです。
var p= document.createElement('p');
p.appendChild(document.createTextNode('Renamed to '+response.name))
mydiv.appendChild(p);
しかし、ヘルパー関数をいつでも定義して、それを削減できます。例:
mydiv.appendChild(makeElement('p', {}, 'Renamed to'+response.name));
(jQuery 1.4 の新しい要素の作成は、同様のスタイルを使用します。)