Javascript 如何使用Mootools链接单击事件,以便它们按顺序执行?

Javascript 如何使用Mootools链接单击事件,以便它们按顺序执行?,javascript,events,mootools,click,Javascript,Events,Mootools,Click,我有一系列的按钮,当它们被点击时会触发列表功能。list函数本身包含一个AJAX请求和一堆其他东西,它们在页面的一个单独部分中加载 var list = function() { } $$('.buttons').addEvent('click', list); 如果我在单击另一个按钮之前等待列表完成,一切都正常。但是,如果我快速单击两个按钮,页面将开始返回错误的响应。事实上,似乎响应在1之前就不同步了。所以,如果我快速点击按钮A,然后点击按钮B,它将加载响应A。如果我稍后点击按钮C,它将加载

我有一系列的按钮,当它们被点击时会触发列表功能。list函数本身包含一个AJAX请求和一堆其他东西,它们在页面的一个单独部分中加载

var list = function() { }
$$('.buttons').addEvent('click', list);
如果我在单击另一个按钮之前等待列表完成,一切都正常。但是,如果我快速单击两个按钮,页面将开始返回错误的响应。事实上,似乎响应在1之前就不同步了。所以,如果我快速点击按钮A,然后点击按钮B,它将加载响应A。如果我稍后点击按钮C,它将加载响应B

有两种方法可以解决这个问题:

1当单击任何按钮时,从其他按钮中删除单击事件,然后在列表完成时将其还原。不幸的是,我已尝试将$$'.buttons.删除列表函数顶部的事件,然后再添加$$'.buttons.添加事件“单击”,列表;但这对问题没有影响

2链接单击事件,使列表仅在前面的列表完成时执行


有人能告诉我如何让第二个解决方案起作用吗?此外,如果有人知道为什么第一个解决方案不起作用,以及为什么我会出现奇怪的延迟AJAX响应行为,那就太好了

第一个解决方案不起作用,因为元素上的事件是按顺序触发的,但异步执行。您需要设置一个回调队列,以便在触发事件时处理

基本思路如下:

addQueuedEvent = function(node, event, callback) {
    if ( typeof callback != "function" ) {
        throw "Callback must be a function";
    }

    event = event.toLowerCase();
    var eventQueue = "_" + event;
    if ( !node.hasOwnProperty(eventQueue) ) {
        node[eventQueue] = [];
    }

    node[eventQueue].push(callback)
};

processEventQueue = function(node, event) {
    var eventQueue = "_" + event;
    if ( node.hasOwnProperty(eventQueue) ) {
        for ( var i=0, l=node[eventQueue].length; i<l; ++i ) {
            node[eventQueue][i]();
        }
    }
};

语法已签出,但未对其进行测试。希望这能有所帮助。

我个人只想在类中设置一个全局/作用域变量,或者其他类似“isClicked=false”的东西

然后只需在click event函数中进行检查,如:

var isClicked = false, click = function() {
    if (isClicked)
        return false;

    isClicked = true;
    // ... do stuff, chained or otherwise...

    // when done, make click function work again:
    isClicked = false; // you can do this onComplete on the fx class also if you use it
};
if (isClicked === true) fxinstance.cancel(); 
我反对将事件与效果链接在一起——如果你有一个动画正在进行,只需等待它结束,否则对于任何认为双击是一种方式的喜欢触发的用户来说,它可能会变得混乱。另一种方法是停止/取消在新单击时发生的任何效果。例如,您可以通过以下方式通过FX停止任何tweens等:

var isClicked = false, click = function() {
    if (isClicked)
        return false;

    isClicked = true;
    // ... do stuff, chained or otherwise...

    // when done, make click function work again:
    isClicked = false; // you can do this onComplete on the fx class also if you use it
};
if (isClicked === true) fxinstance.cancel(); 
您可以做的另一件事是查看mootools.chain类

而且,在任何fx实例上,您都可以传递link:chain并简单地将它们排队

祝你好运