【问题标题】:jqgrid - fire event after every ajax requestjqgrid - 每次ajax请求后触发事件
【发布时间】:2016-03-05 05:29:49
【问题描述】:
我在我的 java spring 项目中使用 jquery jqGrid 插件。我正在使用服务器端分页和排序,所以当用户更改页面时,jqgrid 会发送一个 ajax 请求。我的问题是,有时用户的会话可能在 ajax 请求和我的服务器端代码期间超时,将 ajax 请求重定向到登录页面。 我需要在 jqgrid ajax 请求中检测服务器重定向。事实上,我想要一个在每个 jqgrid 请求之后触发的 afterRequest 事件。我看到loadComplete 和beforeProcessing 事件,但是这些事件在有数据的请求之后触发,如果请求在服务器上没有数据或重定向,这些事件不会触发。我该怎么做?
【问题讨论】:
标签:
javascript
jquery
ajax
jqgrid
【解决方案1】:
我认为你必须改变你的要求。重定向在透明级别上工作,它是XMLHttpRequest 规范的一部分(参见here 和the old answer)。您可能需要设置服务器端所需的标头(例如通过ajaxGridOptions: { xhrFields: { withCredentials: true } } 设置jQuery.ajax 的xhrFields: { withCredentials: true } 选项)。如果需要,您可以使用loadBeforeSend 回调指定Access-Control-Allow-Origin HTTP 标头的任何其他特定值。它以jqXHR 对象为参数,是XMLHTTPRequest 对象的扩展。因此,您可以使用jqXHR.setRequestHeader 方法(参见the answer)来实际自定义请求。
如果重定向后的最终响应有另一个主体,那么您可以在beforeProcessing 或loadError 回调中检测到它。两个回调都包含 jqXHR` 对象作为参数。因此,您可以完全访问来自底层 Ajax 响应的所有信息。
抱歉,我无法为您提供更多详细信息,但您的问题没有包含有关该问题的足够技术详细信息(例如 HTTP 跟踪)。
【解决方案2】:
您可以使用 globa ajax 管理来处理任何 jqgrid 或其他组件的 ajax 重定向,如下所示:
$(document)
.ajaxStart(function() { $('#loadingPane').show(); }) /* catch ajax start event*/
.ajaxStop(function() { $('#loadingPane').hide(); }) /* catch ajax stop event */
.ajaxError(function(event, jqxhr, settings, exception) /* catch ajaxerror and specifically redirections */
{
if ( settings.url.indexOf("aspx")>0 && (jqxhr.status === 401 || jqxhr.status === 403) ) {
event.stopPropagation();
location.reload(true);
}
}
);