错误时将AJAX转换为非AJAX调用

时间:2011-04-09 13:39:28

标签: javascript jquery ajax

假设服务器在Ajax调用上返回500页而不是正常成功内容,我想加载该错误页面,就好像它是非ajax调用一样。

我不想重定向或重新加载,因为Werkzeug提供了一个我想要使用的优秀调试器,但由于调试页面被发送到Ajax处理程序,我不知道如何加载那个页面。我无法重定向到通用页面,因为那时错误数据不会出现,我不想进行第二次调用,因为它们是可能具有修改状态的POST,因此第二次调用可能不会返回相同的堆栈跟踪/错误作为第一次调用。

我最接近的是:

$( "body" ).ajaxError(function(e, jqxhr, settings, exception) {
    $('html').html(jqxhr.responseText);
});

除了没有加载页面的Javascript之外,它几乎可以工作。

2 个答案:

答案 0 :(得分:1)

这是my solution using an iFrame - 我正在加载相同的页面(成功但你也可以在出错时执行)并且在加载时,页面将显示警报并记录到控制台以显示脚本响应HTML工作。我已经使用FF4和Chrome测试了这个。

这是核心功能(信用:http://www.tek-tips.com/viewthread.cfm?qid=1021687

function loadFrame(frameId, text){
    var ifrm = document.getElementById(frameId);
    ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
    ifrm.document.open();
    ifrm.document.write(text);
    ifrm.document.close();
}
  • 使用此方法时我可以想到的一个缺点是,如果响应HTML具有帧破坏代码,或者由于某种原因它依赖于window.location值,则可能会失败。

  • OTOH,使用iframe执行此操作比使用herostwist建议的.html()方法更有利的是.html()使用浏览器的原生innerHTML属性,因此行为变得特定于浏览器;浏览器可能会删除scripthead,这可能无法帮助您进行调试。此外,如果在调用页面和响应页面上存在具有相同ID的元素,您可能会发现事件处理程序未附加到响应页面的元素。但如果这些情况不适用于您的情况,这也应该足够好。

答案 1 :(得分:0)

根据jquery ajax文档,如果将数据类型设置为html“将HTML作为纯文本返回;包含的脚本标记在插入DOM时进行评估。”所以如果你强制数据类型为html,你的方法应该可以工作。