如何显示对AJAX / getJSON请求的错误(text / html)响应?

时间:2011-07-01 00:46:13

标签: javascript ajax error-handling

我的情况是,我正在开发一个小型Web应用程序,其中服务器提供动态JSON响应。服务器建立在cherrypy上。有时,创建JSON数据的代码中存在一个错误,该错误会抛出,并且会抓住它并使用完整的HTML页面回收500错误,详细说明该异常。 (也就是说,响应包含所有内容:<!doctype..><html><head>...</head><body>...</body></html>) 但由于请求是AJAX,因此无法显示。

我可以很容易地拦截这个错误,并在开发工具中查看它;但是我想做的事情(为了简化调试)是打开一个新页面(好像用户已经按照链接)并在浏览器中显示该响应。我试过了

window.open('', '_self');
$(document).html(jqXHR.responseText);

但我得到一个空白页面。我想我可以存储错误文本并在第二次向服务器发出请求时提供它,但有更简洁的方法吗?


要跟进,最终的代码是:

.error(function(jqXHR, textStatus, errorThrown) {
    $(window).bind('unload', function() { document.write(jqXHR.responseText); } );
    var win = window.open('', '_self');
    return false;
});

不确定最终的return false是否有必要,但似乎是好的形式。


再次跟进:上面的代码在Opera中可靠地运行。我以为我也看到它在Webkit中工作,但我开始注意到它不是;并且在进一步测试时,它也不适用于Firefox。

我发现在所有三个平台上都有效:

document.open('text/html', true);
document.write(jqXHR.responseText);
document.close();

不必打开另一个窗口或绑定事件;只需重新打开文档并将文本填入其中。


好吧,我又来了。上述技术要么停止工作,要么当我说它曾经工作时我绊倒了。特别是Chrome似乎没有定义document.open

但是!我刚刚发现了一种似乎无处不在的漂亮技术:

errtext = 'data:text/html;base64,' + window.btoa(jqXHR.responseText);
window.open(errtext, '_self');

这只是将响应转换为完全自包含的data:网址,并在窗口中将其打开。

1 个答案:

答案 0 :(得分:1)

试试这个:

var win = window.open('', '_self');
win.document.getElementsByTagName('Body')[0].innerText = jqXHR.responseText;