2013-06-25 34 views
3

假設你在一個函數中有一個腳本,並且你將它連接到按鈕的onclick事件。JQuery - 當單擊一個按鈕時,如何告訴函數正在運行/忙碌以及如何告訴函數已完成?

我想知道你如何告訴一個功能正忙/正在運行,以及如何告訴它已完成/完成?

在JQuery中是否有一個標誌?

謝謝...

+0

你可以使用某種類型的網站命名空間的變量,以保持對腳本 – sunpietro

+3

使用回調的狀態。 –

+2

[deferred](http://api.jquery.com/jQuery.Deferred/),[promises](http://api.jquery.com/promise/)允許您跟蹤函數的進度。這裏有一個深入的教程:[鏈接](http://msdn.microsoft.com/en-us/magazine/gg723713.aspx) – rusln

回答

0

我喜歡@David Jashi和@rusln在我原來的問題下的後續評論。

不幸的是,他們沒有創建一個「答案」部分,所以我沒有辦法點擊他們(在評論中)的綠色複選標記,我只能回答我的問題,而不是在這裏關閉StackOverflow問題。 :-(

0

如果你在談論AJAX jQuery的功能,如$。員額,你有上成功的功能,您可以指定...

$('#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); 
相關問題