我总是使用这样的东西:
$("a.button").click(function() {
data = ...;
url = ...;
$.post(url, data, function() {
$(this).toggleClass('active');
});
});
问题是当用户连接速度慢并点击该按钮时,似乎什么也没做,因为一旦请求出现,该按钮将改变自己的状态(添加active
类)完成。当然,我可以通过在加载请求时添加微调器来“修复”此行为。
现在看看这个:
$("a.button").click(function() {
$(this).toggleClass('active');
data = ...;
url = ...;
$.post(url, data, function() {
// if request is successful do nothing
// else, if there's an error: $(this).toggleClass('active)
});
});
换句话说,我在按下按钮时立即更改按钮状态,然后检查成功/错误。这是一个好方法吗?你怎么想?还有其他方法吗?
答案 0 :(得分:2)
你在那里有了一般的想法。您可以通过其他方式实现它,例如通过设置全局AJAX ajaxStart
和ajaxSuccess
函数:
$("a.button").click(function() {
data = ...;
url = ...;
$.post(url, data, function() {
// if request is successful do nothing
});
}).ajaxStart(function () {
$(this).toggleClass('active');
}).ajaxComplete(function () {
$(this).toggleClass('active');
}).ajaxError(function () {
//never forget to add error handling, you can show the user a message or maybe try the AJAX request again
});
这些方法注册在某些事件时调用的处理程序,例如 作为初始化或完成,发生任何AJAX请求 这页纸。如果是,则会在每个AJAX请求上触发全局事件 jQuery.ajaxSetup()中的全局属性为true,默认情况下为true。 注意:从不为跨域脚本或JSONP触发全局事件 请求,无论全局的价值如何。
来源:http://api.jquery.com/category/ajax/global-ajax-event-handlers/
答案 1 :(得分:2)
这更像是一个UI问题,而不是代码。我个人更喜欢在没有响应的情况下显示微调器。由于我不知道你正在切换什么类以及它对元素有什么影响,我不知道在成功之前切换是否会让人感到困惑。
无论如何,每个人都知道装载微调器。这可能是安全的。
答案 2 :(得分:0)
使用$.ajax
success
:
来自jquery docs:
$.ajax({
url: "test.html",
success: function(){
$(this).addClass("done");
}
});
答案 3 :(得分:0)
您可以执行以下操作:
$("a.button").click(function() {
var old_text = $(this).text();
var button = $(this);
$(this).text('Processing...');
$(this).attr('disabled', 'disabled'); // disable to button to make sure it cannot be clicked
data = ...;
url = ...;
$.post(url, data, function() {
// after request has finished, re-enable the link
$(button).removeAttr('disabled');
$(button).text(old_text);
});
});
接下来,你应该做类似的事情来捕捉错误(重新启用按钮)。
答案 4 :(得分:0)
它总是取决于您构建网站的方式,但在我看来,活动状态只应在您点击的瞬间触发。
所以这应该是:onmousedown你添加你的类和onmouseup你删除它。
Ajax调用可能会触发一个不同的函数,可能会显示一个加载对话框/微调器。
有几种方法可以构建它:像你一样单独在每个元素上,或者通过一般的样式功能。与Ajax一样,ajaxStart ajaxComplete函数与Jasper说的相同。
就我个人而言,我正在密切使用Ajax,总是动态地更改DOM,所以当使用给定类的元素出现在DOM中时,我使用livequery自动设置样式更改事件,并使用ajaxStart和ajaxComplete来显示加载对话框。