Jqgrid 网格中的实时数据-更好的方法

Jqgrid 网格中的实时数据-更好的方法,jqgrid,Jqgrid,在网格中显示实时数据(股票交易、天气等)的更好方法是什么? 我使用这种方法: setInterval(function(){ jQuery("#list1").trigger('reloadGrid'); }, 5000); 我觉得你的问题很有趣。我认为这个问题对许多其他用户来说可能很有趣。所以+1来自我 setInterval的使用是常见的浏览器无关情况下的最佳方式。当然,应该将setInterval的结果保存在变量中,以便能够使用clearInterval停止它 另一个小小的改

在网格中显示实时数据(股票交易、天气等)的更好方法是什么?
我使用这种方法:

setInterval(function(){
      jQuery("#list1").trigger('reloadGrid');
}, 5000);

我觉得你的问题很有趣。我认为这个问题对许多其他用户来说可能很有趣。所以+1来自我

setInterval
的使用是常见的浏览器无关情况下的最佳方式。当然,应该将
setInterval
的结果保存在变量中,以便能够使用
clearInterval
停止它

另一个小小的改进是使用
[{current:true}]
(有关详细信息,请参阅)作为
触发器的第二个参数:

var$grid=jQuery(#list1”),计时器;
定时器=设置间隔(函数(){
$grid.trigger('reloadGrid',[{current:true}]);
}, 5000);
它将在重新加载网格时保存所选内容

现在许多新的web浏览器都支持。因此,如果web浏览器支持,最好使用这种方式。在这种情况下,如果服务器上的数据没有更改,可以跳过不必要的网格重新加载,并防止服务器的永久池

在我看来,还有一种更常见的方式也很有趣。如果使用网格数据最后更改的某种时间戳,则可以验证数据是否更改。为此,可以在服务器上使用或使用一些通用的附加方法

fill jqGrid的当前回调允许您在处理前实现
回调
以修改服务器响应,但不允许您基于
jqXHR.satus
值(在当前jqGrid代码中为
xhr.status
)停止jqGrid刷新。对jqGrid代码的小修改将允许您在服务器上数据未更改的情况下停止jqGrid刷新。您可以测试
textStatus
st
在当前jqGrid代码中)的
“notmodified”
,或者测试
jqXHR.satus
xhr.status
在当前jqGrid代码中)的
。重要的是,要使用该场景,您应该使用
prmNames:{nd:null}
选项并设置
ETag
Cache Control:private,max age=0
(有关更多信息,请参阅和)

更新:我试图根据我上次的建议创建演示项目,但发现它并不像我上面描述的那么简单。尽管如此,我还是成功了。困难在于无法从jQuery.ajax内部的服务器响应中看到304代码。原因是在下面的地方

对于304未修改的用户代理的响应 生成的条件请求用户代理必须像服务器一样工作 给出了一个200 OK响应,并给出了适当的内容。用户代理 必须允许作者请求标头覆盖自动缓存 验证(例如,如果没有匹配的或自以来修改的),在这种情况下 304未修改必须传递响应

因此,在
$的
success
处理程序中可以看到200ok状态。而ajax
没有从服务器响应中修改304。似乎
XMLHttpRequest
从包含所有HTTP头的缓存中获取完全响应。因此,我决定将上一个HTTP响应的
ETag
作为新的jqGrid参数保存,并用保存的数据测试新响应的
ETag

我看到您使用了PHP(我没有使用:-()。但是我可以阅读和理解PHP代码。我希望您能够以同样的方式阅读C#代码并理解其主要思想。这样您就能够在PHP中实现相同的功能

现在我来描述一下我所做的。首先,我修改了jqGrid源代码,它在处理之前使用

if($.isFunction(ts.p.beforeProcessing)){
处理前调用(ts、数据、st、xhr);
}

if($.isFunction(ts.p.beforeProcessing)){
if(ts.p.beforeProcessing.call(ts,data,st,xhr)==false){
endReq();
返回;
}
}
它将允许从
beforeProcessing
返回false以跳过数据刷新-跳过数据处理。我在演示中使用的
beforeProcessing
的实现基于用法
ETag

处理前:函数(数据、状态、jqXHR){ var currentETag=jqXHR.getResponseHeader(“ETag”),$this=$(this), etagogfgriddata=$this.jqGrid('getGridParam','etagogfgriddata'); 如果(currentETag==eTagOfGridData){ $(“#已处理”).text(“已跳过处理!!!”; 返回false; } $this.jqGrid('setGridParam',{eTagOfGridData:currentETag}); $(“#已处理”).text(“已处理”); }
$(“#isProcessed”).text(“Processed”)
或行
$(“#isProcessed”).text(“Processing skipped!!!”;
设置
“Processed”
“Processing skipped!!!”
div中的文本,我用来直观地指示来自服务器的数据用于填充网格

在演示中,我显示了两个具有相同数据的网格。第一个网格用于编辑数据。第二个网格每秒从服务器中提取数据。如果服务器上的数据未更改,HTTP流量如下所示

HTTP请求:

GEThttp://localhost:34336/Home/DynamicGridData?search=false&rows=10&page=1&sidx=Id&sord=desc&filters= HTTP/1.1
X-request-With:XMLHttpRequest
接受:application/json,text/javascript,*/*;q=0.01
推荐人:http://localhost:34336/
接受语言:de de
接受编码:gzip,deflate
用户代理:Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;WOW64;Trident/5.0;LEN2)
主机:本地主机:34336
如果不匹配:D5k+rkf3T7SDQl8b4/Y1aQ==
康涅狄格州