2013-10-22 122 views
3

我正在開發一個JavaScript類(使用jQuery)來創建自定義彈出窗口,但我無法弄清楚如何「暫停」腳本以等待用戶響應(單擊確定按鈕或取消)等待用戶事件

類是這樣的:

function Popup() 
{ 
} 

Popup.Show = function(text) 
{ 
    var _response; 
    /* code to draw the popup elements*/ 

    $("#button-ok").on("click",function() 
    { 
     _response = "ok!" 
    } 

    return _response 
} 

如果,例如,在警報使用它的方法總是返回「未定義」,因爲它不等待用戶點擊

alert(Popup.Show("hello")) 
//return undefined before the popup appears 

我試過給我們Ë這樣一個while循環:

Popup.Show = function(text) 
{ 
    var _response; 
    var _wait = true; 

    /* code to draw the window */ 

    $("#button-ok").on("click",function() 
    { 
     _wait = false; 
     _response = "ok!" 
    } 

    while(_wait){}; 

    return _response 
} 

但不工作(如我所料)

然後,我怎麼等待用戶點擊?

感謝所有

+0

[停止頁面執行像alert()函數]的可能的副本(http://stackoverflow.com/questions/6807799/stop-page-execution-like-the-alert-function) –

回答

0

這是一個典型的JavaScript問題。

$("#button-ok").on("click",function() 
{ 
    _response = "ok!" 
} 

return _response 

現在讓我們看看這裏發生了什麼。您正在爲該按鈕設置一個onClick偵聽器,併爲該事件分配一個回調函數。把這個函數看作你傳遞給另一個函數的參數。它不是直接執行的。

現在,而不是使用類似while(_wait){};的東西,並強制它執行同步,你應該使用該回調。

Popup.Show = function(text) 
{ 

    $("#button-ok").on("click",function() 
    { 
      drawSomething('ok'); 
    } 

}; 

var drawSomthing = function(response) { 
// do something 
}; 

這是一個很好的開始進入回調:http://javascriptissexy.com/

+0

謝謝,但真正的問題是在返回值之前等待用戶事件。我能怎麼做? – Luca

+1

這是不可能的,你必須重構你的代碼,以利用回調。像這樣:[link](http://jsfiddle.net/Vyra9/) – jHilscher

0

JavaScript是異步的,則無法 「暫停」 執行。而且,當javascript運行時,整個用戶界面凍結,所以用戶不能點擊按鈕。

將回調註冊到click事件後,程序會繼續執行。 在你的腳本

_wait = false; 
    _response = "ok!" 

以下行永遠不會執行,直到Popup.Show函數返回。 也許this Nettuts article about javascript event programming將幫助你瞭解範例。

這裏是一個嘗試解決您的代碼:

Popup.Show = function(text) 
{ 
    /* code to draw the window */ 

    // bind click event 
    var myPopup = this; 
    $("#button-ok").on("click",function() 
    { 
    // this code will be executed after Popup.Show has return 
    myPopup.response = "ok!" 
    myPopup.Close(); 
    } 
} 
+0

是的,我知道這些事件是異步的,問題恰恰在於此。什麼可以解決這個問題,並確保函數返回用戶響應? – Luca

+0

這是不可能的。在用戶點擊按鈕之前,該函數將總是**返回。你必須改變你的代碼來考慮這一點。 –

+2

所以我不能複製這個:'alert(prompt())'?在這種情況下,prompt()等待用戶確認,否則? – Luca

0

的你正在嘗試做的背景下,爲什麼一點點vauge,因爲它好像你正試圖重建的「警報」功能。但'提醒'是由瀏覽器設置的窗口功能。這個問題似乎是Stop page execution like the alert() function

這基本上談論回調鏈,本質上封裝功能,所以你可以執行它們的運行順序。我也認爲你對代碼的運行有一個根本性的誤解。正如所討論的,事件處理程序是異步的,並且在按順序讀取代碼的同時,它不會運行事件hanlders回調中設置的函數,直到觸發事件。