是否有可能自动显示/隐藏ajax加载gif,并同时禁用/启用提交按钮?jquery自动加载gif和按钮禁用提交点击
$("#save_button_id").click(function() {
if ($('#save_button_id').hasClass('ui-state-disabled')) return false;
Save();
});
function Save() {
StartAjax($("#save_button_id"));
$.ajax({
success: function (data) {
EndAjax($("#save_button_id"));
// etc...
},
error: function (xhr, status, error) {
EndAjax($("#save_button_id"));
// etc ...
}
});
}
function StartAjax(button) {
DisableButtonClick(button);
$("#ajaxLoad").show();
}
function EndAjax(button) {
EnableButtonClick(button);
$("#ajaxLoad").hide();
}
我见过几个地方说说如何使用.ajaxStart:提交时,我这样做(当提交按钮是一个风格<一>不是输入类型=提交)
目前()自动显示加载gif,但是是否也可以找到对被点击的按钮(样式为< a>标签)的引用,并自动禁用/启用它?
这样做的关键在于不必每次都手动输入Start/EndAjax,并确保应用程序在任何地方都一致。
编辑
无答案为止提供自动化的 - 任何解决方案(如我上面的电流之一),你必须之前和之后的每一个$就(手动输入开始/结束)导致维修问题:它很容易忘记将开始/结束放在一些$ .ajax()调用旁边,如果您想稍后改变它的工作方式,则需要通过每一个来完成更改。
EDIT 2 - 澄清地点Re .delegate()建议
你说:“你可以将你的事件处理程序任何元素” - 但我想它附加到每按钮元素( DRY):所以我已经修改了你的建议的第1部分是:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
这解决了第一个问题,那就是如何显示加载.gif注意任何按键,而无需重复输入“ $(“#ajaxLoad”)。show()“无处不存在$ .ajax()调用。
下一部分是如何禁用任何按钮,当它被点击(再次没有重复的代码) - 你建议.delegate()。但在你的例子中,每个按钮点击都会调用Save()方法。 (我改变了选择,以配合我的HTML)
$('div#buttons a.ui-icon').delegate('button:not(.ui-state-disabled)', 'click', function() {
$(this).toggleClass('ui-state-disabled');
Save(); // this line needs replacing with a call to $(this).something
});
的问题,这是$(本)并不总是保存按钮(选择返回所有的按钮),这可能是删除按钮或取消按钮等等。所以调用$(this).toggleClass很好,但是调用Save()意味着你调用了错误的函数。所有这些按钮已经有了。点击方法:
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
因此,这是一个需要被称为原始点击功能,它说:$(本)以上.something。在这一点上,它应该叫做原始点击 - 或者说更准确的说它应该会泡到最初的.click。 .delegate必须更通用,原始的.click将提供具体的实现。
作为对您的编辑的回应:您必须在某个点或另一个点上定义这些内容;没有逃脱的。一种可能的解决方案是自己创建一个重叠的ajax函数,比如'doAjax(...,...)',包括jQuery的'$ .ajax'和按钮操作。但是这取决于你在这里试图做什么(不同的事情),这个重叠的功能是否可以保持简单或者变得非常复杂并且失去了它的所有优点。 – Alec 2010-05-21 01:47:04