Mik*_*e C 8 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);
Run Code Online (Sandbox Code Playgroud)
但我得到一个空白页面.我想我可以存储错误文本并在第二次请求服务器中提供它,但有更清洁的方法吗?
为了跟进,最终的代码是:
.error(function(jqXHR, textStatus, errorThrown) {
$(window).bind('unload', function() { document.write(jqXHR.responseText); } );
var win = window.open('', '_self');
return false;
});
Run Code Online (Sandbox Code Playgroud)
不确定最后return false是否有必要,但似乎是好的形式.
再次跟进:上面的代码在Opera中可靠地运行.我以为我也看到它在Webkit中工作,但我开始注意到它不是; 并且在进一步测试时,它也不适用于Firefox.
我发现在所有三个平台上工作的是:
document.open('text/html', true);
document.write(jqXHR.responseText);
document.close();
Run Code Online (Sandbox Code Playgroud)
不必打开另一个窗口或绑定事件; 只需重新打开文档并将文本填入其中.
好吧,我又来了.上述技术要么停止工作,要么当我说它曾经工作时我绊倒了.特别是Chrome似乎没有document.open定义.
但!我刚刚发现了一种似乎无处不在的漂亮技术:
errtext = 'data:text/html;base64,' + window.btoa(jqXHR.responseText);
window.open(errtext, '_self');
Run Code Online (Sandbox Code Playgroud)
这只是将响应转换为完全自包含的data:URL并在窗口中打开它.
尝试这个:
var win = window.open('', '_self');
win.document.getElementsByTagName('Body')[0].innerText = jqXHR.responseText;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4505 次 |
| 最近记录: |