我在jquery中排队事件时遇到问题。我有一个电梯项目,允许用户点击按钮,然后灯亮,然后数字改变。这样可以正常工作,除非他们在第一次到达地板之前再次打出一个数字。我希望它在到达第二个点击的地板(或第三个,或第四个等)之前首先被选中。我已经用.promise完成了一些东西,完成后等等,但似乎都没有。
我正在使用.click似乎是问题所在,因为它会触发函数,无论它当前在哪里。麻烦的是,我似乎无法找到任何替代方案,它需要先完成当前的操作才能进入任何其他楼层。
我希望我能很好地解释这一点。如果没有,请告诉我。也许完全有另一种方式。还在学习这个前端/ jQuery的东西。
$( ".button" ).click(function(event) {
// doing stuff here....
$( runMainscript() ).promise().done(function() {
runMainscript(buttonclicked, floorQ);
});
});
function runMainscript(buttonclicked,floorQ) {
//doing stuff here
}
BTW,这是每层楼的计时器,持续2秒钟。
JSfiddle:http://jsfiddle.net/ak25Lxab/1/
看看你如何快速点击两个按钮,它会跳转?
答案 0 :(得分:0)
deferred对象的工作方式略有不同。您应该显式声明一个这样的延迟变量:
var dfd = new $.Deferred();
当你要发起done
回调时,你应该致电:
dfd.resolve();
因此,您现在的脚本排队部分如下所示:
$.when(dfd.promise()).done(function() {
dfd = new $.Deferred();
var onfloor = $("#onfloor").text();
runMainscript(buttonclicked, floorQ, onfloor);
});
在runMainscript
内,你解决了当电梯到达楼层时推迟的dfd
。
见demo。现在,所有楼层都使用延迟对象进入队列。
我不是deferreds的专家,所以也许你可以进一步优化这个脚本。
答案 1 :(得分:-1)
我真的不明白你的问题而且你的jsfiddle对我不起作用,但据我所知,你想要在电梯移动时停止听点击事件。
要执行此操作,您可以停止侦听click事件,然后还原侦听器。 http://api.jquery.com/off/
理想情况下,听一下点击事件,一旦它被触发停止侦听点击事件,执行操作然后在.button
的点击事件上恢复监听器
或者您可以尝试执行此类操作,放置状态,如果状态未清除则不执行任何操作: jQuery - How can I temporarily disable the onclick event listener after the event has been fired?