在发生错误时将AJAX转换为非AJAX调用

Convert AJAX to non-AJAX call on error

本文关键字:AJAX 转换 调用 错误      更新时间:2023-09-26

假设服务器在Ajax调用时返回500页而不是正常的成功内容,那么我希望加载该错误页面,就像它是非Ajax调用一样加载。

我不希望重定向或重新加载,因为Werkzeug提供了一个我想使用的优秀调试器,但由于调试页面被发送到Ajax处理程序,我不知道如何加载该页面。我不能重定向到一个通用的页面,因为错误数据不会在那里,我不想做第二次调用,因为他们是post可能有修改的状态,所以第二次调用可能不会返回相同的堆栈跟踪/错误作为第一次调用。

我得到的最接近的是:

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

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

这是我使用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,使用iframes的优势超过使用.html()方法,如herostwist所建议的,.html()使用浏览器的原生innerHTML属性,因此行为成为浏览器特定的;浏览器可能会剥离scripthead,这可能不会帮助您调试。此外,如果在调用页和响应页上存在具有相同id的元素,您可能会发现事件处理程序没有附加到响应页的元素。但如果这些情况不适合你的情况,这应该也足够了。

根据jquery ajax文档,如果你将数据类型设置为html "返回html作为纯文本;包含的脚本标签在插入到DOM中时被计算。"所以如果你强制数据类型为html,你的方法应该可以工作。