2

我有一个html页面,当我点击页面上的文件链接时,会弹出文件下载对话框,并且这个文件对话框会锁定页面。我的意思是如果不选择其中一个选项(打开、保存、取消),我无法在页面上执行任何操作(这很正常)。我需要的是javascript是否可以检查页面是否被锁定。(或者是否弹出文件对话框?)

ps不要说“给链接添加onclick事件”,因为服务器可能响应很慢(比如点击后30秒)

4

2 回答 2

3

如果您知道您的服务器正在返回一个文件以供下载,那么您可以通过这个迂回技巧猜测对话框何时出现(我从 stackoverflow 对我提出的相关问题的回答中得到):

  1. 当你从你的页面发出 HTTP 请求时,添加一个参数,它的值是一些随机字符串(比如"random" + new Date().getTime()——它不一定是安全的,但你想避免冲突)

  2. 服务器查找该参数。当它开始发回附件以供下载时,它会添加一个以您的随机字符串作为其值的 cookie。

  3. 现在,在页面发出 HTTP 请求后,它会启动一个间隔计时器。计时器函数中的代码检查是否document.cookie查找该随机字符串。只要document.cookie包含该字符串,您就知道 HTTP 响应已发送到浏览器。由于您知道浏览器会要求用户保存附件,因此您可以推断此时正在显示文件对话框。

我需要的是一种处理 IE 安全问题的方法,即文件附件来自除直接用户“点击”以外的事件。我需要关闭一个模式对话框,所以我需要知道 HTTP 响应何时返回。

于 2010-04-02T13:10:26.643 回答
1

因为页面被锁定了,你不能用 JavaScript 做任何事情,因为它也被锁定了。

但是,你想做什么?您是否试图以某种方式记录用户正在下载文件的事实?如果是的话,有更好的方法来做到这一点,它们在服务器端。使用一些服务器端脚本语言来提供文件并记录它被下载的事实。

如果这不是你想要做的,那么唯一的方法是使用onclick链接或onunload/ onbeforeunload,但这些不太可靠,我相信你会在不同的浏览器上发现完全不同的行为。

其实,现在想起来,还有一种方法,但是很脏。这个想法是设置一个间隔以每秒运行一次,并检查两次运行之间是否超过一秒。就像是:

var lastTime = new Date().getTime();
function checkTime() {
    var curTime = new Date().getTime();
    if (curTime - lastTime > 1100) { // 1100 because there might be small browser lags 
        // do something after the dialog appeared and the user did something with it
    }
    lastTime = curTime;
}
setInterval(checkTime, 1000);

请注意,有些浏览器(我认为 Chrome 就是一个例子)在打开该对话框时不会阻止页面,因此这可能不起作用。如果您打算使用它,请务必仔细检查所有内容。

我现在得去洗澡了。

于 2010-04-02T11:49:15.760 回答