我正在开发一个网站,其中用户的“主页”页面包含一些数据供一些广泛的JavaScript代码使用。目前,数据在文档正文末尾的脚本标记中编码为JSON对象,之后实例化GUI控件对象,以便它可以访问DOM和JSON对象。我喜欢这种结构,因为它允许页面快速加载。它看起来像这样:
<body>
<script type="text/javascript" src="mylib.js"></script>
<div>...lots of DOM and text content...</div>
<script type="text/javascript">
var userData = {...}; // Encoded by HTTP response handler.
$(document).ready(function() {
// GUI object which modifies form controls, etc.
new MyGuiObject(userData, document.form.myForm);
};
</script>
</body>
但是,新功能可能要求将userData对象作为单独的HTTP请求返回,这意味着内联表单将是重复的(并且违反了DRY principle)。重构上面的代码以便对userData使用该AJAX请求很有吸引力,但它引入了另一个HTTP请求,我们知道这些数据是我们知道的(并且可用)。
是否值得更改代码以使用从AJAX调用中检索到的userData?如果是这样,对从中检索数据的URL进行编码的最佳做法是什么(考虑到Web框架可以更好地动态生成)?
答案 0 :(得分:1)
是否值得更改代码以使用从AJAX调用中检索到的userData?
我不会这么想,但这将是一个意见问题,在某种程度上取决于你的整体环境。这是一个判断电话。
如果你有生成对象的底层代码(无论是在初始script
元素内还是以后响应ajax调用),你都没有违反DRY原则。
如果出现的HTML页面是完全静态的(因此可以缓存),那么您将重复自己,因为您必须首先在HTML中拥有该对象,然后再次使用动态响应创建它一个ajax请求。但是如果初始HTML已经动态生成,那么只需使用中心函数在两种情况下生成对象。 (该函数可以生成JSON格式的字符串,然后在HTML页面上输出前面带有var userData =
的字符串,因为JSON是JavaScript对象文字格式的子集,因此您可以将其放入脚本中object literal有效。)
是否干,我不愿意向页面加载添加可避免的HTTP请求。
如果是这样,对从中检索数据的URL进行编码的最佳做法是什么......
我不完全确定您对URL进行编码的含义。如果您的意思是包含JSON的响应,请将其与Content-Type: application/json
一起发回。在将jQuery交给success
函数之前,jQuery会理解它并将其反序列化为一个对象。
答案 1 :(得分:0)
但是,新功能可能会 需要userData对象 作为单独的HTTP请求返回, 这意味着内联形式将是一个 重复(和违反DRY 原理)。重构很诱人 上面的代码使用那个AJAX 请求userData但它 引入了另一个HTTP请求 我们知道需要的数据(和 立即。
内联表单不一定是重复信息。它允许用户开始查看对象,并且根据您提供的额外信息,如果用户已禁用JavaScript,它可能允许您的应用程序继续工作(因为JavaScript应该只能增强应用程序,尽管我知道实际上,现代应用几乎不可能实现这一点。但是,查看表单(或表单的某些部分)的直接能力是一个优势。
因此DRY不应该意味着使某些应用程序缺乏性能或响应能力。这些目标往往处于紧张状态,但你必须达到一个快乐的中间地带。无可否认,有时易于维护可能会导致一点性能损失,但在大多数情况下,您可能不希望您的用户因此而受苦。
是否值得更改要使用的代码 从AJAX检索的userData 呼叫?
听起来你在上面说它将是必需的,不是吗?如果是这样,为什么需要异步接收呢?您是否从其他站点获取数据并希望尽快将内容发送给用户,然后使用其他信息更新它们?否则,为了获得最佳性能,将用户数据直接提供给用户而不是让他们等待Ajax应答可能会更好,因为Ajax最适合应用程序中稍后需要的数据,特别是在IE&lt; 8处理2个以上同时连接的限制。
如果您确实需要Ajax,也许您可以提供有关加载的一些信息,然后再使用其他Ajax返回的数据。
如果是这样,最佳做法是什么 用于编码的URL 检索数据(考虑到它 会更好地动态生成 通过网络框架)?
通过对网址进行编码,您的意思是什么?
你的意思是编码URL的字符?在核心JavaScript中,这通常使用encodeURIComponent()完成,但在jQuery中,可以使用serialize()和jQuery.param()等方法为您处理,前者用于将现有表单序列化为编码的URL,后者用于将数组或对象转换为URL编码格式。
如果您的意思是在GET或POST之间做出决定,如果您的检索对服务器没有副作用,则应使用GET,而在大多数情况下,POST应该是您应该使用的。