防止第二次执行,直到第一次以jquery结束

时间:2012-01-27 17:37:55

标签: javascript jquery

我有以下代码......

$("#myID").click(function(){

    //do some ajax requisition here
    //make it appears in screen with a fadeIn(300)

});

#myID是一个标签的ID

但是我需要在实际执行结束之前不再调用此函数,我尝试在注释之后添加许多不同的代码,但没有成功,如果你可以帮我阻止第二次执行!

fadeIn()不执行执行,在执行效果时执行代码,有人可以帮助我吗?

由于

5 个答案:

答案 0 :(得分:4)

您可以设置一个标志,用于存储AJAX功能是否正在运行的状态:

$(function () {

    //set flag to allow AJAX calls
    var AJAX_ok = true;

    //bind click event handler
    $("#myID").click(function(){

        //check if it is ok to run an AJAX request right now
        if (AJAX_ok === true) {

           //if we can run an AJAX request then set the AJAX_ok flag to false so another one does not start
           AJAX_ok = false;

           //make the AJAX call
           $.getJSON('<url>', function (data) {

                //now that the callback function has been called, the AJAX call is done, so we re-enable the AJAX_ok flag
                AJAX_ok = true;

                //make it appears in screen with a fadeIn(300)
                //if DATA is valid HTML then...
                $(data).css('display', 'none').appendTo('#some-container').fadeIn(300);
            });
        }
    });
});

这一次只能从#myID元素的click事件处理程序运行一个AJAX调用。

答案 1 :(得分:1)

它可以杀死以前的ajax,或者你可以创建一个运行的布尔值,当有人点击你将它设置为true并且你有一个if(!running){// do ajax},在ajax的回调你将运行设置为false

答案 2 :(得分:0)

使用同步AJAX调用(默认为异步)。有关如何执行此操作的详细信息,请参阅this question

答案 3 :(得分:0)

可能有100种更好的方法,但是......

$("#myID").click(function() {
    var is_running = $(this).data('running');

    if (!is_running)
        $(this).data('running', true);
    else
        return;

    /* Do stuff */

    $(this).data('running', false);
}

答案 4 :(得分:0)

使用回调来确保执行顺序。

$("#myID").click(function(){    
     $.ajax({
         url: 'whatever url you are calling',
         success: function(){
             alert('ajax done');   
             $('whatever "it" is').fadeIn(300, function(){
                 //code place here will not execute until after fade in
                 alert('fadeIn done');
             }
        }
     })
});