从javascript检索表单提交的状态

时间:2013-11-01 12:53:27

标签: javascript html forms

我有一个Web应用程序,用户可以通过单击按钮导出结果。据我所知,无法从javascript启动文件“下载”,所以我使用简单的服务器往返开始下载:

  1. 用户点击导出按钮
  2. 某些javascript会创建一个隐藏的表单字段,其中包含我在文件中所需的数据
  3. 触发表单提交
  4. 服务器获取表单数据并将其作为文件发送回用户
  5. 触发文件下载
  6. 由于上传数据可能需要一些时间,因此我在步骤1之后将导出按钮上的文本更改为“准备下载”。在步骤4或5的某处,我想将按钮更改回正常状态。有没有办法知道浏览器何时开始接收来自帖子请求的响应?

1 个答案:

答案 0 :(得分:0)

我尝试使用此解决方案:

  1. 向页面添加不可见的iframe
  2. 让表单使用目标属性
  3. 发布到iframe
  4. 使用iframe的onLoad事件(由表单帖子触发)重置我的按钮
  5. 这适用于Firefox,但当服务器响应是文件时,Chrome中不会触发onLoad事件。

    我选择的解决方案使用cookie并适用于所有浏览器:

    1. 当用户点击下载按钮时,向包含随机值的表单添加隐藏字段。
    2. 在服务器上,查找包含随机值的表单字段,并设置具有相同值的cookie。将使用下一个服务器响应设置cookie,从而在下载开始时进行设置。
    3. 在客户端上,每隔一秒左右开始轮询cookie,以查找步骤1中的随机值。
    4. 客户端找到该值后,重置按钮。
    5. 这是下载按钮的事件处理程序中的相关代码,其中#nonce是我放置随机值的隐藏字段:

      var nonce = Math.random();                      // generate random number
      $("#nonce").val(nonce);                         // set number as field value
      $("#downloadDataset").button('loading');        // set button to loading state
      var downloadTimer = setInterval(function () {   // start polling the cookies
          if (document.cookie.indexOf(nonce) != -1) {
              $("#downloadDataset").button('reset');  // reset button
              clearInterval(downloadTimer);           // stop polling the cookies
          }
      }, 1000);                                       // check every 1000ms