【发布时间】:2020-11-08 13:35:03
【问题描述】:
你如何在 vanilla javascript 而不是 jQuery 中做这样的事情?
- 单击按钮提交刷新/重定向到同一页面的表单
- 页面刷新时,按钮被点击后禁用
- localStorage 将禁用的按钮存储 X 秒
- X 秒过后,再次启用禁用的按钮
- 如果用户再次单击按钮,请再次重复此过程
【问题讨论】:
标签: javascript local-storage spam-prevention
你如何在 vanilla javascript 而不是 jQuery 中做这样的事情?
【问题讨论】:
标签: javascript local-storage spam-prevention
无法创建 sn-p,因为 stackoverlow 不允许访问 localStorage,但是:
<form onsubmit="handleSubmit(event)">
<input type="text" id="target" />
<input type="submit" value="submit"/>
</form>
<script>
let disable = localStorage.getItem("disable");
if(disable){
console.log("5 second timeout");
setTimeout(()=> {
localStorage.removeItem("disable");
disable = false;
console.log("button enabled");
},5000);
}
function handleSubmit(e) {
e.preventDefault();
if(disable){
console.log("button is disabled");
return;
}
localStorage.setItem("disable",true);
location.reload();
}
</script>
编辑:类似下面的内容会针对特定按钮修改它
function handlerWrapper(e) {
e.preventDefault();
if(disable){
console.log("button is disabled");
return;
}
yourActualHandler(e);
localStorage.setItem("disable",true);
location.reload();
}
【讨论】:
除了你提到的localStorage API,你只需要按钮上的disabled 属性和窗口对象上的setTimeout 方法。
请参阅代码内的 cmets 以获得进一步的解释。
(注意:由于沙盒,使用localStorage 的代码无法在 SO sn-ps 中运行,但如果您想看到它运行,可以在文本编辑器中将其保存为 html 文件。)
<button id="refresh">Refresh</button>
<script>
const refreshBtn = document.getElementById("refresh");
refreshBtn.addEventListener("click", refresh);
disable();
function disable() {
// If `disableRefresh` is truthy...
if (localStorage.getItem("disableRefresh")) {
// ...Disables the button and re-enables it after 2 seconds
refreshBtn.setAttribute("disabled", ""); // Any value makes it true
setTimeout(enable, 2000); // JavaScript measures times in milliseconds
}
}
function enable() {
// Removes (boolean) `disabled` attribute and (string) `disableRefresh` item
refreshBtn.removeAttribute("disabled");
localStorage.removeItem("disableRefresh")
}
function refresh() {
// Sets `disableRefresh` to a truthy value, and refreshes the page
localStorage.setItem("disableRefresh", "yep");
location = location;
};
</script>
【讨论】:
refreshBtn.setAttribute("disabled", ""); 添加为refresh 函数正文中的第一行...所以当单击该按钮时,它会立即变为禁用状态。
refresh函数的底部呢?