2013-10-22 89 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回调中设置的函数,直到触发事件。