JSON応答にHTMLマークアップを含める必要がありますか?


13

eコマースサイトで、カートにアイテムを追加するときに、選択可能なオプションを含むポップアップウィンドウを表示したいと思います。iPod Shuffleを注文していて、彫刻する色とテキストを選択する必要があるとします。

ウィンドウをモーダルにしたいので、Ajax呼び出しで生成されたライトボックスを使用しています。現在、2つのオプションがあります。

オプション1:データのみを送信し、JavaScriptを使用してHTMLマークアップを生成する

これの良い点は、Ajaxリクエストを最小限に抑えて、データをマークアップと混合しないことです。

この点でそれほど優れていないのは、サーバー側のテンプレートエンジンを使用する代わりに、JavaScriptを使用してレンダリングを行う必要があることです。クライアント側のテンプレートソリューションを使用して、アプローチを少しクリーンアップできる場合があります

オプション2:HTMLマークアップを送信する

これの良い点は、残りのレンダリングタスク(Django)で使用しているのと同じサーバー側テンプレートエンジンを使用して、ライトボックスのレンダリングを実行できることです。JavaScriptは、HTMLフラグメントをページに挿入するためにのみ使用されます。そのため、レンダリングは明らかにレンダリングエンジンに委ねられます。私には理にかなっています。

しかし、何らかの理由で、Ajax呼び出しでデータとマークアップを混合することに不安を感じています。何が私を不安にさせているのか分かりません。つまり、すべてのWebページが提供されるのと同じ方法で、データとマークアップが正しいのですか?


いい質問ですね。しかし、stackoverflowに属しているようです。
サイードNeamati

1
@SaeedNeamatiソフトウェア設計の質問、特にこのようなホワイトボードの概念的な質問は、ここで話題になり、Stack Overflowでは話題になりません。

回答:


10

JSONにはデータのみが含まれ、マークアップは含まれません。長期的には、サイトの他の部分でJSONデータを使用する可能性があるため、このアプローチはより拡張可能です。マークアップを含めると、同じデータを使用して別のテンプレートを作成するのがはるかに難しくなります。


2
再利用に関する素晴らしい点。さまざまな理由から、誰もがAjaxリクエストにデータのみを含め、マークアップは含めないように投票しているようです。しかし、これは大きなものです。ありがとう。
マイクM.リン

2
マークアップなしのJSONが小さく、使用する帯域幅が少ないことは言うまでもありません。

@JackManey:良い点でもあります。しかし、追加の帯域幅の本当のコストは、HTTPリクエストのコストをすでに消費した後はそれほどではありません。また、クライアントマシンが非常に安っぽく、JavaScriptを使用してDOMをリアルタイムで生成するのにさらに費用がかかることがわかっているセットアップを想像できます。考えてみてください:古代のマシン/ブラウザ上のユーザーを使用した内部アプリ。
マイクM.リン

3

リクエストでデータを送信し、jsでマークアップを作成します。もう1つの利点は、帯域幅の使用量が少なくなることです。それは一種の個人的な好みですが、クライアント側のマークアップをサーバー側から遠ざけることはおそらく良い考えです。私はDjangoウェブサイトも持っています。私は、テンプレートシステムを使用して、ページにjson変数を配置し(作成するajax要件が1つ少ない)、マシンで開発するときにsrcファイルを使用します。すべてのクライアント側はExtJSで行われます。


JSONデータをページに書き込むというアイデアが気に入っています。カートに追加するアイテムがわかるまで追加データを取得しないため、ここではありません。ページレイアウトのリクエストを行った後、データの1秒が最近よくあるようです。JavaScript変数にデータを含めると、2つの異なるビットのレンダリングコード(クライアントとサーバー)がなくても、2番目のHTTPリクエストが不要になります。
マイクM.リン

ああ、あなたのサーバーは、ユーザーが事前にカートに入れようとしているものを知るのに十分なほど進んでいないようです;)
-15:

1

あなたは両方の長所と短所について話したと思います。ライトボックスのJavaScriptをジャンゴビューから生成する3番目のオプションを見てみませんか。次に、JSONにデータを含めるだけで、ビューごとに更新しますか?

できることは、すべてのテンプレートコードをjavascript変数にラップし、クライアント側でJSONリクエストを受け取った後にjavascriptで出力することです。


返信いただきありがとうございます。それは実際にオプション1で私が意図したことです。コンテナとしてのライトボックスはページに焼き付けられますが、非表示になります。AjaxリクエストからのJSONデータは、コンテナ内のコンテンツを生成するために使用されます。そのコンテンツの一部は、HTMLを使用してマークアップされます。オプション1をどのように解釈しましたか?たぶんそれが私の3番目の選択肢になります。
マイクM.リン

私はこのstackoverflow.com/questions/6008908/の行に沿って何かを考えていました... そしてJSONを使用して初期ロード後にデータを置き換えます
ライアン・ギボンズ

0

マークアップにテンプレートエンジンを使用し、値を格納するための非表示フィールドをどこかに保持する必要があります。このフィールドは、セレクターを使用してドキュメント内で検索できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.