我应该在JSON响应中包含HTML标记吗?


13

在电子商务网站中,将商品添加到购物车时,我想显示一个弹出窗口,其中包含您可以选择的选项。假设您要订购iPod Shuffle,现在必须选择要雕刻的颜色和文字。

我希望窗口是模态的,所以我正在使用由Ajax调用填充的灯箱。现在我有两个选择:

选项1:仅发送数据,并使用JavaScript生成HTML标记

这样做的好处是,它将Ajax请求减少到了最低限度,并且没有将数据与标记混合在一起。

这样做的不好之处在于,现在我需要使用JavaScript进行渲染,而不是在服务器端使用模板引擎来进行渲染。通过使用客户端模板解决方案,我也许可以稍微清理一下方法。

选项2:发送HTML标记

这样做的好处是,我可以拥有与其余渲染任务(Django)相同的服务器端模板引擎,进行灯箱的渲染。JavaScript仅用于将HTML片段插入页面。因此,它显然将渲染留给了渲染引擎。我感觉合理。

但是由于某种原因,我不愿意在Ajax调用中混合数据和标记。我不确定是什么使我对此感到不安。我的意思是,每个网页的投放方式都一样-数据加标记-对吗?


好问题。但是似乎属于stackoverflow。
2011年

1
@SaeedNeamati软件设计问题,尤其是类似白板的概念性问题,在此处热门话题,而在Stack Overflow上则是热门话题

Answers:


10

JSON应该只包含数据且不包含标记。从长远来看,这种方法是可扩展的,因为在站点的其他部分中可能会使用JSON数据。如果包含标记,则使用相同的数据填充另一个模板会变得更加困难。


2
关于重用的要点。出于各种原因,每个人似乎都投票要求Ajax请求仅包含数据,而不包含标记。但这是一个很大的。谢谢。
Mike M. Lin

2
更不用说没有标记的JSON较小并且使用较少的带宽。

@JackManey:也是一个好点。但是,在您已经负担完HTTP请求的成本之后,增加带宽的真正成本并没有那么多。我可以想象一些设置,在这些设置中您知道客户端计算机是如此糟糕,以至于使用JavaScript实时生成DOM会花费您更多的钱。思考:使用旧机器/浏览器的用户的内部应用程序。
Mike M. Lin

3

我将在请求中发送数据并在js中建立标记。另一个好处是带宽使用量将减少。这是一种个人喜好,但使客户端标记远离服务器端可能是一个更好的主意。我也有一个Django网站,我只使用模板系统在页面上放置一些json变量(少做一些ajax请求),而在我的机器上进行开发时则使用src文件。所有客户端都由ExtJS完成。


我喜欢您将JSON数据刻录到页面中的想法-不在这里,因为在知道您要添加到购物车中的项目之前,我不会获取其他数据。现在请求页面布局,然后再请求第二个数据似乎很普遍。将数据包含在JavaScript变量中可以消除对第二个HTTP请求的需要,而不必具有两个不同的呈现代码位(即客户端和服务器)。
Mike M. Lin

哦,我看到您的服务器还不够先进,无法事先知道用户要在购物车中放入什么;)。
2011年

1

我认为您已经谈论了两者的利弊。为什么不看看让django视图生成灯箱JavaScript的第三种选择呢?然后让您的JSON仅包含要为每个视图更新的数据吗?

您应该能够做的就是将所有模板代码包装到javascript变量中,然后在客户端收到JSON请求后,再用javascript输出它们。


谢谢回复。这实际上就是我在选项1中的意思。作为容器的灯箱将被刻录到页面中但被隐藏。来自Ajax请求的JSON数据将用于在容器中生成内容。其中一些内容将使用HTML进行标记。您如何解释选项1?也许是我的第三选择。
Mike M. Lin

我在考虑这个stackoverflow.com/questions/6008908/…的思路,然后在初始加载后使用JSON替换数据
Ryan Gibbons

0

您应该使用模板引擎进行标记,并在某处保留一个隐藏字段来存储值,然后您可以使用选择器在文档中找到该字段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.