是jQuery。
我有一个注册表格。在域文本框字段中,人们填写域名,然后onblur Ajax调用registar API以验证域可用性。
根据网络速度的不同,验证最多可能需要15秒。
在此等待期间,如果用户点击提交按钮,如何阻止?
我的想法很简单:在任何Ajax调用完成加载之前,我不想让人们点击提交。
我可以想办法,但我不确定这是否是一个好方法。我需要建议。
beforeSend: function(){
$("#btnSubmit").attr("disabled", "disabled");
},
complete: function(){
$("#btnSubmit").attr("disabled", "");
}
<input type="button" name="btnSubmit" id="btnSubmit" value="my button" />
答案 0 :(得分:6)
无论你做什么不在你的AJAX调用上使用async: false
,特别是因为你的请求是如此长寿(15秒)。它将禁用所有 Javascript,直到AJAX调用完成。
你做这件事的方式很好。您可以使用jQuery的global AJAX event handlers来概括它。为每个相关的输入控件提供一个合适的标记类,如“ajax”:
<input type="button" class="ajax" value="Register Domain">
使用:
$(document).ajaxStart(function() {
$(".ajax").attr("disabled", true);
}).ajaxComplete(function() {
$(".ajax").removeAttr("disabled");
});
所以你在这里正在做的是听全局AJAX事件,当他们正在进行时你禁用所有在AJAX调用正在进行时你不想被点击的控件。
答案 1 :(得分:3)
将async
设置为false
可能会有效,但可能会使浏览器完全挂起15秒。您最好的办法是禁用submit元素并使用变量以其他方式阻止提交,存储验证是否在进行中:
var validating = false;
$(function() {
$('form').submit(function() {
if(validating) return false;
var button = $(this).find('input:submit, input:button');
button.attr('disabled', 'disabled');
validating = true;
$.ajax({
url: 'validator.php',
data: $(this).serialize(),
success: function() {
validating = false;
button.removeAttr('disabled');
}
});
});
});
这样,用户无法以任何其他方式提交表单。如果您只禁用提交按钮,则可以使用回车键提交表单(不确定)。使用一个告知验证是否正在运行的变量是防止意外提交的可靠方法。
答案 2 :(得分:1)
查看BlockUi。
这很容易实现。您可以使用处理类型消息来阻止元素甚至整个页面,以便用户知道正在发生的事情。然后你只需在你的ajax调用完成时取消阻止它。
我用过它的一个例子
$('#elementtobloack').block({
centerY: 0,
message: 'Some useful message'
});
$.ajax(
{
type: "POST",
url: "...",
data: "{}",
contentType: "application/json;charset=utf-8",
dataType: "json",
success: function(msg) {
//do something
//unblock your element
$('#elementtoblock').unblock();
},
error: function(msg) {
//do something on error -- alert(msg.responseText);
//unblock on failure as well or the element will remain blocked
$('#elementtobloak').unblock();
}
});
答案 3 :(得分:0)
无论你最后怎么做,一定要在验证时显示一些进度指示器。
如果用户填写了每个表单元素,之后无法按下submit
按钮(因为验证过程仍在运行),他/她会非常困惑。
15秒是很长一段时间,所以请确保用户知道发生了什么。
答案 4 :(得分:0)
答案 5 :(得分:-1)
输入按钮:
<input typ="submit" value="Register" onsubmit="return ajaxCheck();" />
Js代码:
var onAjax = false; function ajaxCheck(){ if(onAjax) return false; else return true; } $("element").onblur(function(){ onAjax = true; //whatever you need to do here $.ajax({ //standard params success: function(){ onAjax = false; }, failure: function(){ onAjax = false; } }); });