我认为这很容易做到,但我找不到任何帮助我的东西。
我有一个功能
(function($){
myFunction = function(e){
e.preventDefault();
// do stuff
// load ajax content
// animate and show
}
$('.button').on( 'click', myFunction);
})(jQuery);
现在这有效,但我需要知道,如果有人在很短的时间内按下很多.button
s导致一切都被button
我已经尝试过promise()
$('.button').on( 'click', function(){
$.when( myFunction() ).done(function() {
alert('finished')
});
});
但是这给了我一个错误e is undefined
和
$('.button').on( 'click', myFunction).promise().done(function() {
alert('finisehd');
});
任何人都知道我做错了什么以及如何才能让它发挥作用?
答案 0 :(得分:1)
最常见的解决方案是在调用myFunction
时在click处理程序中设置一个变量,并在每次调用click处理程序时检查其状态。
这可以在以下某处完成:
(function($){
var wait = false;
myFunction = function(e){
e.preventDefault();
if (wait) {
return;
}
wait = true;
// ...
wait = false;
}
$('.button').on( 'click', myFunction);
})(jQuery);
答案 1 :(得分:0)
您的函数myFunction
需要一个参数,当您调用myFunction()
时,参数丢失
没有经过测试,但它应该有效:
$('.button').on( 'click', function(e){
$.when( myFunction(e) ).done(function() {
alert('finished')
});
});
答案 2 :(得分:0)
除了不传递e
变量。您错误地使用了$.when
。
如果您希望在 done
完成其ajax调用后使用名为的myFunction
函数。您需要从myFunction
返回承诺。
function myFunction(e) {
return $.Deferred(function(deferred) {
doAjax(function(content) { // callback
deferred.resolve(content);
});
});
}
现在你做的时候
// inside event handler
$.when(myFunction(e)).done(function(content) {
// whoo!
});