在发生错误时将AJAX转换为非AJAX调用
Convert AJAX to non-AJAX call on error
假设服务器在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
属性,因此行为成为浏览器特定的;浏览器可能会剥离script
或head
,这可能不会帮助您调试。此外,如果在调用页和响应页上存在具有相同id的元素,您可能会发现事件处理程序没有附加到响应页的元素。但如果这些情况不适合你的情况,这应该也足够了。
根据jquery ajax文档,如果你将数据类型设置为html "返回html作为纯文本;包含的脚本标签在插入到DOM中时被计算。"所以如果你强制数据类型为html,你的方法应该可以工作。
- 将curl查询转换为jQuery.ajax()
- Ajax响应转换
- RoR-将提交表单转换为AJAX
- Ajax调用OGRE转换器
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 将带有dataType:json的jQuery.ajax转换为纯javascript
- 将Jquery Ajax转换为纯JavaScriptAjax
- 将 ajax 转换为 node.js
- 尝试将jquery ajax转换为angular http
- 如何让mvc动作触发jquery ajax转换器
- 用ajax转换传统帖子
- 如何将AJAX转换为angular js,并为数组的每个元素重复代码块?
- 如何将jquery ajax转换为原生javascript
- 使用ajax转换旧登录
- 发送“iframe.contents()“;通过Ajax转换PHP脚本有什么想法吗?
- 如何将同步ajax转换为异步ajax
- 400从ajax转换为$http时出错
- 将 Javascript Ajax 转换为 jQuery Ajax 的最佳方法
- PHP变量通过ajax转换为javascript
- 在发生错误时将AJAX转换为非AJAX调用