5

我正在开发一个 javascript 类(使用 jQuery)来创建自定义弹出窗口,但我无法弄清楚如何“暂停”脚本以等待用户响应(单击 OK 按钮或取消)

课程是这样的:

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
}

但不起作用(如我所料)

那么,如何等待用户点击呢?

谢谢大家

4

3 回答 3

1

JavaScript 是异步的,您不能“暂停”执行。此外,当 javascript 运行时,整个用户界面冻结,因此用户无法单击按钮。

一旦你注册了点击事件的回调,程序就会继续执行。脚本中的以下行

    _wait = false;
    _response = "ok!"

Popup.Show在函数返回之前永远不会被执行。也许这篇关于 javascript 事件编程的 Nettuts 文章将帮助您理解范例。

这是修复您的代码的尝试:

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();
  }
}
于 2013-10-22T05:20:31.790 回答
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/

于 2013-10-22T05:13:44.913 回答
0

您正在尝试做的事情的背景以及为什么有点模糊,因为您似乎正在尝试重建“警报”功能。但是'alert'是一个由浏览器设置的窗口功能。这个问题似乎是停止页面执行的重复,如 alert() 函数

基本上讲的是回调链,本质上是封装功能,以便您可以强制执行它们的运行顺序。我还认为您对代码的运行方式存在根本性的误解。正如所讨论的事件处理程序是异步的,并且在按顺序读取代码时,它不会运行在事件处理程序回调中设置的函数,直到该事件被触发。

于 2017-04-08T00:04:02.637 回答