【问题标题】:How to stop spinner after operation is finished操作完成后如何停止微调器
【发布时间】:2022-01-02 12:31:30
【问题描述】:

我正在使用 Flask 构建我的第一个 Web 应用程序。我是 html/ JavaScript/ CSS 新手 - 请多多包涵。

应用程序执行以下操作:用户上传 Excel 文件如下:

<form method="POST" enctype="multipart/form-data">
  <input type="file" name="file" id="file" />

然后他们使用下拉列表选择某些参数。当用户点击“提交”时,使用 pandas 操作数据,并在 Excel 中导出一个新文件。

我设法使用 html 和 CSS 向“提交”按钮添加了一个微调器。我在我的 JavaScript 中添加了一个事件侦听器,以便在单击按钮时激活微调器。目前,微调器无限期地运行,但是我希望微调器停止并且按钮文本在操作完成后恢复为“提交”,即导出完成。有谁知道我如何做到这一点?

这是我的html:

    <button type="submit" id="submit" class="button">
        <span class="button__text">Submit</span>
    </button>

这是我的 CSS:

    <style>
        .button {
          position: relative;
          padding: 8px 16px;
          background: #009579;
          border: none;
          outline: none;
          border-radius: 2px;
          cursor: pointer;
        }

        .button:active {
          background: #007a63;
        }

        .button__text {
          font: bold 20px "Quicksand", san-serif;
          color: #ffffff;
          transition: all 0.2s;
        }

        .button--loading .button__text {
          visibility: hidden;
          opacity: 0;
        }

        .button--loading::after {
          content: "";
          position: absolute;
          width: 16px;
          height: 16px;
          top: 0;
          left: 0;
          right: 0;
          bottom: 0;
          margin: auto;
          border: 4px solid transparent;
          border-top-color: #ffffff;
          border-radius: 50%;
          animation: button-loading-spinner 1s ease infinite;
        }

        /*animate spinner - spin from 0 to 1 turn*/
        @keyframes button-loading-spinner {
            from {
                transform: rotate(0turn);
            }

            to {
                transform: rotate(1turn);
            }

    </style>

这是我的 JavaScript:

    <script type="text/javascript">
            (() => {
            const elem = document.getElementById('submit');
            elem.disabled = false;
            elem.addEventListener('click', e=> {
                elem.classList.add('button--loading');
                });
            })();
    </script>

【问题讨论】:

  • 这完全取决于您如何处理上传操作。通常,您会使用 Fetch 或 XMLHttpRequest 手动向服务器发出请求,并在请求完成时删除 CSS 类。你能告诉我们更多关于这方面的信息吗?
  • 谢谢。老实说,我认为“上传文件”有点用词不当。用户提交文件,但它没有保存在服务器上。不确定这是否有所作为。这是脚本:
    尝试了解轮询以获取服务器状态,但正在进行中。
  • 请在您的问题中添加任何附加代码,因为 cmets 中的代码很难阅读。您还可以为我们创建可运行的 sn-ps,让我们体验您的体验。在编辑您的问题时查找&lt;&gt; 图标。
  • 谢谢。现在完成了:)
  • 恐怕这仍然不能告诉我们任何事情。查看您的代码,我希望当您单击submit 按钮时,加载程序将开始旋转并且页面将重新加载。重新加载是提交数据的&lt;form&gt; 元素的默认行为。我说的对吗?

标签: javascript html css flask addeventlistener


【解决方案1】:

基本上,您的前端(HTML/Javascript)需要某种方式知道“导出完成”的时间。取决于您对“导出”和“完成”的定义。

在最基本的层面上,您可以让前端在上传开始后每秒轮询一次服务器,并让服务器返回某种关于进程状态的状态。这可能很简单:

GET /status/1234

&gt; {"status": "IN_PROGRESS"}

其中,当“导出完成”切换到:

&gt; {"status": "COMPLETE"}

当前端收到 COMPLETE 状态时,它会移除微调器。注意1234。您将需要某种方式来识别正在进行的上传。一种方法是在您第一次接受表单时为其分配一个随机 id,因此初始的 POST /upload 返回 &gt; {'id': 1234},然后客户端可以将其用于后续轮询。

如果“导出完成”实际上只表示文件已完成上传,您仍然可以使用轮询方法,但更巧妙的方法是使用客户端(Web 浏览器)方法来确定已发送多少字节(见this SO answer)。

【讨论】:

  • 感谢您的回复!老实说,我现在有点迷茫。我是 JavaScript、CSS 和 html 的绝对初学者。我设法创建了一个使用 JQuery 和 Ajax 每秒运行的轮询函数,但不确定服务器将如何返回您在示例中显示的状态。我会继续调查。需要澄清的一件事是,我认为“上传文件”有点用词不当。用户提交 Excel 文件,但未保存在服务器上。这是脚本:
  • 好的,听起来您的服务器对您的 POST 的响应本身就表明该过程已完成,是时候移除微调器了。在这种情况下,您应该在 POST 完成后,在您的 AJAX 调用的成功处理程序中移除微调器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多