如何防止缓慢的表单用户体验破坏必需的属性?

发布于 2025-01-11 13:17:40 字数 471 浏览 0 评论 0原文

我有一个看起来像这样的表格:

<form method="POST">
<label>Your name:
<input name="name" required>
</label>
<input type="submit" onclick="this.form.submit(); this.disabled=true; this.value='Sending…';">
</form>

表单的后端最多需要 10 秒才能响应(区块链!),因此禁用输入以防止多次重试。然而,它随后会破坏所需的验证,用户可以发送空的有效负载。

有什么建议可以使用 Vanilla 或者 VueJS 来防止这种情况发生吗?

非常感谢,

I have a form that looks like:

<form method="POST">
<label>Your name:
<input name="name" required>
</label>
<input type="submit" onclick="this.form.submit(); this.disabled=true; this.value='Sending…';">
</form>

The form's backend takes upto 10 seconds to respond (blockchain!), hence the disabled input to prevent multiple retries. However it then breaks the required validation and users can send in empty payloads.

Any tips how to prevent this using Vanilla or maybe VueJS?

Many thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

思慕 2025-01-18 13:17:40

使用 Vuejs 你可以尝试:

  1. @submit.prevent="action" 在表单标签中而不是 onClick....
  2. 添加异步等待和 try catch
  3. 如果你愿意,你也可以禁用提交中的按钮以确保用户无法发送空的有效负载,

这是要点代码:https://gist.github.com/jiyuuki/e6f8f7bb67b48014223d1561119ac2fa

Using Vuejs you can try :

  1. @submit.prevent="action" in form tag instead of onClick....
  2. add async await with try catch
  3. if you want you can also disable your button in submit to be sure users can't send an empty payloads

here's a gist code : https://gist.github.com/jiyuuki/e6f8f7bb67b48014223d1561119ac2fa

深海蓝天 2025-01-18 13:17:40

尝试使用如下所示的数据属性来控制按钮。

export default {
  name: 'Form',
  data() {
    return {
      isLoading: false,
    }
  },
  methods: {
    async submitForm() {
      this.isLoading = true;
      await this.form.submit(); // Assuming this is where you make the time taking call
      this.disabled=true;
      this.value='Sending…';
    }
  }
  
}
<form method="POST">
  <label>Your name:
<input name="name" required>
</label>
  <input  
  :disabled="isLoading"
  type="button" 
  @click="submitFrom">
</form>

响应到达后将 isLoading 重置为 false。

Try to control the button with a data property like below.

export default {
  name: 'Form',
  data() {
    return {
      isLoading: false,
    }
  },
  methods: {
    async submitForm() {
      this.isLoading = true;
      await this.form.submit(); // Assuming this is where you make the time taking call
      this.disabled=true;
      this.value='Sending…';
    }
  }
  
}
<form method="POST">
  <label>Your name:
<input name="name" required>
</label>
  <input  
  :disabled="isLoading"
  type="button" 
  @click="submitFrom">
</form>

Reset the isLoading to false after the response reaches.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文