6.6 错误处理
到现在为止,我们的请求都能够成功地完成,新内容都能如期显示在页面中。但负责任的开发也会考虑到网络或数据发生错误的可能性,并适当地记录或报告这些错误。在本地环境中开发Ajax应用有时候会让开发人员过于乐观,因为除了拼错URL这种简单的情况外,Ajax错误不会发生在本地。更加严重的,$.get()
和.load()
等快捷的Ajax方法并没有提供错误回调参数,因此我们需要找找其他地方是否有解决方案。
除了使用全局的.ajaxError()
方法,我们还可以利用jQuery的延迟对象系统。第11章将讨论延迟对象的具体细节,现在只要知道可以给.load()
之外的Ajax方法连缀.done()
、.always()
和.fail()
方法,并通过它们添加相应的回调函数即可。比如,可以在代码清单6-16的基础上,把URL改为一个不存在的地址,然后测试.fail()
方法,如代码清单6-17所示。
代码清单6-17
- $(document).ready(function() {
- $('#letter-e a').click(function(event) {
- event.preventDefault();
- var requestData = {term: $(this).text()};
- $.get('z.php', requestData, function(data) {
- $('#dictionary').html(data);
- }).fail(function(jqXHR) {
- $('#dictionary')
- .html('An error occurred: ' + jqXHR.status)
- .append(jqXHR.responseText);
- });
- });
- });
现在,单击字母E开头的任何链接都会产生一个错误,如图6-12所示。根据服务器的配置不同,jqXHR.responseText
的内容可能会有所不同。
图 6-12
此外,.status
属性中包含着服务器返回的状态码。这些代码由HTTP规范定义,当触发.fail()
处理程序时,可以根据下表解读错误。
响 应 码 | 说 明 |
---|---|
400 | 请求语法错误 |
401 | 未授权 |
403 | 禁止访问 |
404 | 未发现请求的URL |
500 | 服务器内部错误 |
W3C站点(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)有完整的响应码列表。第13章还会更深入地介绍错误处理。