我碰巧在我的应用程序中注意到,当 datatables/tabletools 时,copy_csv_xls_pdf.swf 被调用了 3 次。被调用。我整理了a jsfiddle which (sometimes) illustrates the issue :
从 TableTools documentation 可以观察到相同的行为:
这种行为特别有问题,因为浏览器似乎没有为同一请求期间的后续加载缓存文件的初始加载。 p>
对于由 SWF“供电”的每个按钮,似乎都对此文件有一个请求。
不过,为什么这个文件会被加载多次?有必要吗?如何防止它(同时仍然提供相同的功能)?
忽略以下不必要的代码...
<小时/>...仅提供这样的内容,以便允许我包含 jsfiddle 的链接:
$('#browser_data').dataTable({
"bPaginate": false,
"bAutoWidth": false,
"bLengthChange": false,
"sDom": "<'row-fluid'<'span6'f><'span6'<'pull-right'T>>r>t",
"oTableTools": {
"aButtons": [ "copy", "xls", "pdf" ],
"sSwfPath": "http://datatables.net/release-datatables/extras/TableTools/media/swf/copy_csv_xls_pdf.swf"
}
});
最佳答案
谷歌浏览器
这是请求 header 的片段 - 无论我硬刷新还是只是刷新, header 都是相同的:
:host:datatables.net
:method:GET
:path:/release-datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf
:scheme:https
:version:HTTP/1.1
accept:*/*
accept-encoding:gzip, deflate, sdch
accept-language:en-US,en;q=0.8,sw;q=0.6
cache-control:no-cache
cookie:
你看到了吗cache-control:no-cache
?这似乎表明在发出这些请求时缓存被显式关闭。每次刷新都会显示每个请求的状态 200 ...我从来没有看到 304。
就屏幕截图中的 304 状态而言,重要的是它们是 304、304、304 而不是 200、304、304强>。这表明每个请求在除 URL 之外的某些方面都是唯一的,因此每个请求都必须显式缓存。让我们看看这是否是一个正确的假设......
Mozilla Firefox
这是我运行一些测试所遵循的过程:
- 将缓存限制设置为 0.34GB,非常启用缓存
- 加载页面:并刷新并记录结果
- 通过硬刷新和刷新重现结果
以下是结果——每个按钮一个状态:
- 初始加载状态:200、200、200、200
- 刷新:304、304、304、304
- 硬刷新:200、200、200、200
- 硬刷新后刷新:304, 304, 304, 304
考虑到按钮并不完全相同,即使 .swf
URL 是相同的,这不是很有意义吗? 相同的 URL 每次都会产生不同的按钮!是否可以通过某种签名来区分每个按钮的请求? 这是动态内容的行为——相同的网址不同的内容。
最终测试:
我关闭了缓存 - 将缓存限制设置为 0,结果是:
- 硬刷新:200、200、200、200
- 刷新:200、304、200、200
结论
- 每个按钮内容都会被缓存。这就是为什么即使有足够的磁盘空间分配给缓存初始页面加载和硬刷新也显示 200、200、200、200,而不是 200、304、304、304。
- 是否缓存这些按钮取决于您的浏览器设置:是否启用缓存以及分配给缓存的空间大小。
- 很可能200, 304, 200, 200可能表明没有足够的磁盘空间来缓存复制按钮,但这正是CSV需要 kbd> 按钮,并且没有任何内容可以缓存 Excel 和 PDF 按钮。
关于jquery - 为什么 tableTools 对同一个 SWF 文件进行多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448965/