jQuery:点击事件后排队一个函数

时间:2014-08-16 20:34:02

标签: javascript jquery javascript-events

我在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/

看看你如何快速点击两个按钮,它会跳转?

2 个答案:

答案 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?