数据表是否缓存 ajaxSource 的结果?
Does datatables cache results for an ajaxSource?
我已经在 portlet war 文件中嵌入了 jquery 数据表,并且遇到了一些有趣的行为,我需要一些解释。
这就是我的 javascript 的样子...http://pastebin.com/qXpwt9A7
这是场景。
我打开网页并在 'TextA' 上进行关键字搜索
结果: ajax 请求被发送到服务器以加载 jquery 数据表。
在不关闭浏览器的情况下,我在 'TextB' 上进行了关键字搜索。
结果: ajax 请求被发送到服务器以加载 jquery 数据表。
在不关闭浏览器的情况下,我再次在 'TextA' 上进行关键字搜索。
结果:没有向服务器发送请求。但是我的数据表足够聪明,可以记住步骤 1 中检索到的结果,并将结果显示在页面上。
这对我来说效果很好,但我不知道为什么会这样。
如果我不得不猜测,我在想数据表中一定有一些智能,它缓存了参数相同的 ajax 源的结果,这样它就不必触发再次请求 ajax 来源。
我说的对吗?
我正在使用数据表 1.9.4.
默认情况下,DataTables v.1.9.4 会阻止 fnServerData
函数中的请求缓存,请注意下面 DataTables 源代码摘录中的 "cache": false
。
"fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
oSettings.jqXHR = $.ajax( {
"url": sUrl,
"data": aoData,
"success": function (json) {
if ( json.sError ) {
oSettings.oApi._fnLog( oSettings, 0, json.sError );
}
$(oSettings.oInstance).trigger('xhr', [oSettings, json]);
fnCallback( json );
},
"dataType": "json",
"cache": false,
"type": oSettings.sServerMethod,
"error": function (xhr, error, thrown) {
if ( error == "parsererror" ) {
oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
"server could not be parsed. This is caused by a JSON formatting error." );
}
}
} );
}
但是在您的代码中,您将覆盖 fnServerData
并使用 $.getJSON()
,这是 $.ajax() 的 shorthand 函数,而没有指定 cache
选项。 cache
选项的默认值为 true
,这就是缓存您的请求的原因。
以下是 jQuery 手册的节选:
cache
(default: true
, false
for dataType
'script'
and 'jsonp'
)
Type: Boolean
If set to false
, it will force requested pages not to be
cached by the browser. Note: Setting cache
to false
will only work
correctly with HEAD and GET requests. It works by appending
"_={timestamp}" to the GET parameters. The parameter is not needed for
other types of requests, except in IE8 when a POST is made to a URL
that has already been requested by a GET.
我已经在 portlet war 文件中嵌入了 jquery 数据表,并且遇到了一些有趣的行为,我需要一些解释。
这就是我的 javascript 的样子...http://pastebin.com/qXpwt9A7
这是场景。
我打开网页并在 'TextA' 上进行关键字搜索 结果: ajax 请求被发送到服务器以加载 jquery 数据表。
在不关闭浏览器的情况下,我在 'TextB' 上进行了关键字搜索。 结果: ajax 请求被发送到服务器以加载 jquery 数据表。
在不关闭浏览器的情况下,我再次在 'TextA' 上进行关键字搜索。 结果:没有向服务器发送请求。但是我的数据表足够聪明,可以记住步骤 1 中检索到的结果,并将结果显示在页面上。
这对我来说效果很好,但我不知道为什么会这样。
如果我不得不猜测,我在想数据表中一定有一些智能,它缓存了参数相同的 ajax 源的结果,这样它就不必触发再次请求 ajax 来源。
我说的对吗? 我正在使用数据表 1.9.4.
默认情况下,DataTables v.1.9.4 会阻止 fnServerData
函数中的请求缓存,请注意下面 DataTables 源代码摘录中的 "cache": false
。
"fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
oSettings.jqXHR = $.ajax( {
"url": sUrl,
"data": aoData,
"success": function (json) {
if ( json.sError ) {
oSettings.oApi._fnLog( oSettings, 0, json.sError );
}
$(oSettings.oInstance).trigger('xhr', [oSettings, json]);
fnCallback( json );
},
"dataType": "json",
"cache": false,
"type": oSettings.sServerMethod,
"error": function (xhr, error, thrown) {
if ( error == "parsererror" ) {
oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
"server could not be parsed. This is caused by a JSON formatting error." );
}
}
} );
}
但是在您的代码中,您将覆盖 fnServerData
并使用 $.getJSON()
,这是 $.ajax() 的 shorthand 函数,而没有指定 cache
选项。 cache
选项的默认值为 true
,这就是缓存您的请求的原因。
以下是 jQuery 手册的节选:
cache
(default:true
,false
fordataType
'script'
and'jsonp'
)Type: Boolean
If set to
false
, it will force requested pages not to be cached by the browser. Note: Settingcache
tofalse
will only work correctly with HEAD and GET requests. It works by appending "_={timestamp}" to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a POST is made to a URL that has already been requested by a GET.