2013-06-25 3 views
3

Скажите, что у вас есть скрипт в функции, и вы подключили его к кнопке onclick event.JQuery - когда нажата кнопка, как я могу сказать, что функция работает/занята, и как я могу сказать, что функция выполнена?

Мне интересно, как вы говорите, что функция занята/работает и как сказать, что она выполнена/завершена?

Есть ли в JQuery флаг для этого?

Спасибо ...

+0

вы могли бы использовать какой-то веб-пространство имен переменных, чтобы сохранить состояние сценария – sunpietro

+3

использования обратных вызовов для этого. –

+2

[отложен] (http://api.jquery.com/jQuery.Deferred/), [обещает] (http://api.jquery.com/promise/) позволяет отслеживать ход выполнения функций. И вот углубленное руководство по обоим: [link] (http://msdn.microsoft.com/en-us/magazine/gg723713.aspx) – rusln

ответ

0

Мне нравится оба следуют вверх комментарии от @David Яши и @rusln под моим оригинальный вопрос.

К сожалению, они не создали раздел «Ответ», поэтому у меня нет возможности щелкнуть по ним зеленую галочку (в комментариях), и я могу ответить только на свой вопрос, чтобы закрыть здесь вопрос StackOverflow. :-(

0

Если вы говорите о функциях AJAX JQuery, такие как $ .post, то есть на успех функции можно назначить ...

$('#loading').fadeIn(200); 
$.post('link.php', $('#form').serialize(), function(data) { 
    // this will trigger when data is done retrieving 
    $('#newcontent').html(data); 
    $('#loading').fadeOut(200); 
}); 
+0

Здесь нет ajax ... – fletchsod

0

Просто держать переменная со статусом функции:

var myFunctionRunning; 

$('#myElem').click(function() { 
    myFunctionRunning = true; 

    // long running stuff goes here 

    myFunctionRunning = false; 
}); 
+0

Нет смысла иметь глобальную переменную, чтобы отслеживать ее. – fletchsod

+0

@fletchsod Вы не указали какой-либо контекст в вопросе. Если вы хотите произвольно проверить, работает ли функция или нет, она должна храниться во всем мире. Если вы просто хотите, чтобы функция не выполнялась дважды, вы можете поместить переменную в ее функцию, чтобы ограничить область. В противном случае вы можете разместить его там, где это наиболее удобно, на основе вашего дизайна. – Turch

0

Если вы хотите, чтобы выполнить функцию и проверить, если он работает, то вы можете проверить хранение .data(), связанный с этим элементом.

$(document).on("click.demo", "#btnRun", function (e) { 
    e.preventDefault(); 

    var self = $(this), 
     status = self.data("_status"); 

    if (status == "Running") return false; 

    // Define the status of execution 
    if(!status) self.data("_status", "Running"); 

    // TODO: add your code here 

    // When finish, delete the flag 
    self.removeData("_status"); 
}); 

Также вы можете создать closure (см JavaScript: Closures)

Рассмотрим следующий пример: http://jsfiddle.net/qundC

// Creates a closure with status and the callback 
var fnExecute = (function() { 
    var _running = false; 

    // Function returned by the closure 
    return function (e) { 
     e.preventDefault(); 

     if(_running) { 
      $('#status').text("Running..."); 
      return false; 
     } 

     _running = true; 
     $('#status').text("Starts..."); 

     // TODO: add your code here 

     // Emulates an expensive processing 
     setTimeout(function() { 
      _running = false; 
      $('#status').text("Done!!"); 
     }, 5000); 
    }; 
}()); 

// Assigns the function returned by the closure 
$(document).on("click.demo", "#btnRun", fnExecute);