我有一个按钮,当单击时调用一个函数 - 此函数执行一些异步Ajax并在Ajax返回时警告消息框。我不希望用户多次点击该按钮 - 如果他在Ajax没有返回时点击按钮,则应该提醒错误消息。
我知道这可以使用全局布尔变量轻松完成(将其初始设置为true,进行ajax调用并将其设置为false - 当ajax返回时再次将其设置为true - 检查全局是否为false时用户单击按钮)。也可以类似地完成,如果不使用窗口/全局对象,我使用另一个包含该函数和布尔值的全局对象
但是,我不太喜欢上述方法 - 我认为它们是一个有点老派的Javascript。我想知道是否有一种更优雅的方式来做,例如使用JS闭包!
答案 0 :(得分:1)
使用此方法,您的变量不会泄漏到全局范围。无法从函数外部操纵此变量:
var foo = (function(){
var pending = false;
return function foo(){
if(pending) return;
pending = true;
//...Code
//When finished:
pending = false;
}
})()
其他人可能会建议设置该功能的属性,但这个属性可以很容易地从外部调整,这是不可取的。
答案 1 :(得分:1)
var callback = (function()
{
var executing = false;
function yourfunc()
{
if(executing) return; // exit if pending
executing = true;
// here send the request
// edit: when the ajax response has returned
xxxx.onreadystatechange....{
// do what you need to do with ajax data
executing = false;
};
}
return yourfunc;
})();
callback();
答案 2 :(得分:1)
匿名函数的格式为
(function(){}))()
last()提供匿名函数的参数。
在上面的示例脚本中(由wes)返回错误,因为回调不是已定义的函数。 Rob使用闭包的方法听起来不错。
干杯...... Sree