我们没有直接链接到网站上要下载的文件,而是链接到一个写着"谢谢下载"的页面。该页面上有跟踪代码,所以我们知道有多少人下载了该文件。页面使用所示的jQuery代码启动下载文件,该代码在页面加载后添加了一个短延迟,然后才开始下载。下载位置有一个内容处置标头,因此它总是在浏览器中正确下载,并留下"谢谢下载"页面。这一切都很好。
如果用户继续浏览该页面,然后进行反击,问题就会出现。下载再次启动。
使用window.location.replace(href);
似乎并没有解决问题。
由于提供页面的CMS已将其设置为立即过期,因此不会缓存页面,这一事实使问题更加复杂。
关于(i(避免这一问题的方法的建议;(ii(有什么更好的方法来处理文件下载/感谢页面?
jQuery代码
$(document).ready(function () {
$('a.autoDownload').each(function () {
setTimeout('navigateToDownload("' + $(this).attr('href') + '")', 4000);
});
});
function navigateToDownload(href) {
document.location.href = href;
}
一种可能的方法是在页面首次加载时通过Javascript设置cookie。然后,如果该页面再次加载,您可以检查cookie的存在,如果存在,不执行自动下载?
以jQuery的Cookie插件为例:
$(document).ready(function () {
$('a.autoDownload').each(function () {
var hasDownloadedThisLink = $.cookie("site." + $(this).attr('id'));
if (!hasDownloadedThisLink) {
$.cookie("site." + $(this).attr('id'), "true");
setTimeout('navigateToDownload("' + $(this).attr('href') + '")', 4000);
}
});
});
这只是一个例子。如果你这样做,你必须考虑可能有多少下载链接,因为你可以设置的cookie数量是有限制的。还要注意的是,我在cookie中使用了链接的id
属性来识别它们——我认为这比使用某种形式的href
属性更合适。我还在cookie名称前面加了site.
。
有几个解决方案。这里有一个例子:
function navigateToDownload(href){
var e = document.createElement("iframe");
e.src=href;
e.style.display='none';
document.body.appendChild(e);
}
其他实现可能存在,但我怀疑它们是否不那么"时髦"。