【发布时间】:2011-03-01 20:06:29
【问题描述】:
我目前在不同的页面中有几个操作按钮,每个按钮在单击时都会执行一些 AJAX 调用。换句话说,我到处都有这样的代码:-
$("#searchButton")
.button()
.click(function() {
...
$.get(url, { data: ...}, function(data) { ... });
...
});
在进行一些测试后,似乎某些 AJAX 调用在调用回调函数之前至少需要几秒钟以上的时间来处理。
我的计划是在进行 AJAX 调用时禁用该按钮,并在 AJAX 调用完成后重新启用它。这是为了防止用户在处理请求时多次单击按钮。我发现的一种解决方案是利用 unbind() 和 bind() 函数。修改我的代码后,现在是这样的:-
var searchButtonClickHandler = function() {
...
$.get(url, { data: ...}, function(data) { ... });
...
};
$("#searchButton")
.button()
.ajaxStart(function() {
$(this).button("disable").unbind("click");
})
.ajaxStop(function() {
$(this).button("enable").bind("click", searchButtonClickHandler);
})
.click(searchButtonClickHandler);
此代码运行良好。基本上,它会在进行 AJAX 调用时删除单击处理程序,并在 AJAX 调用完成时添加回单击处理程序。
我的问题是......是否可以概括按钮禁用/启用,以便我不必在所有 UI 按钮上实现 ajaxStart() 和 ajaxStop?
理想情况下,我想使用我之前的代码 sn-p 仅在按钮上注册单击事件处理程序,然后使用 .ui-button 选择器启用/禁用所有按钮,类似这样...
$(".ui-button")
.ajaxStart(function() {
$(this).button("disable").unbind("click");
})
.ajaxStop(function() {
// not sure how to bind the handler here
$(this).button("enable").bind("click", ?? );
});
...但是,这不起作用,我在此处绑定点击处理程序时遇到了麻烦。
我想得越多,似乎我需要创建一个按钮生成器函数来执行此操作,例如:-
var createButton = function(selectorName, clickHandler) {
$(selectorName)
.button()
.ajaxStart(function() {
$(this).button("disable").unbind("click");
})
.ajaxStop(function() {
$(this).button("enable").bind("click", clickHandler);
})
.click(clickHandler);
};
// create button like this
createButton("#searchButton", function() {
...
$.get(url, { data: ...}, function(data) { ... });
...
});
...但是这种方法只会禁用/启用所选按钮,我想将其应用于所有 UI 按钮。
有没有人有更好的方法来禁用/启用页面中的所有按钮?
谢谢。
【问题讨论】:
-
您可以使用
$('input[type=button]').attr('disabled','disable');禁用所有按钮 -
我不确定它是否是,OP 想要什么
标签: javascript jquery-ui jquery