JavaScript“while”循环没有冻结浏览器?

时间:2011-03-25 01:21:23

标签: javascript jquery html jquery-ui

我正在尝试延迟点击链接的默认操作,直到用户点击“是”或“否”进行确认。问题是while循环冻结了浏览器(甚至没有显示对话框,即使首先调用“open”):

$(".remove").click(function() {
  $("#dialog").dialog("open");

  while (1) {
    // Count sheep
  }
});

显然,“1”仅用于测试目的。最终我希望它检查由对话框设置的变量。但就目前而言,我想知道如何使用这样的循环来延迟默认的点击操作。

谢谢,

迈克尔

6 个答案:

答案 0 :(得分:4)

一个非常简单的答案是使用window.setInterval而不是while循环,但这仍然不是一个好的答案。

正确的答案是让对话框在用户单击按钮时进行回调。编辑:因为你正在使用jQuery,你不必编写回调函数。对话框函数需要第二个回调参数:

$("#dialog").dialog("open", function() {
    // do your stuff for when they click OK
});

答案 1 :(得分:4)

你做不到。您必须退出该对话框才能显示该功能。只要该功能正在运行,浏览器就不会进行任何更新。

您必须使用事件来处理用户输入。

答案 2 :(得分:3)

您可以使用超时和回调

setTimeout(FunctionHere, 3000);

编辑:我也认为值得注意的是有一个jQuery .delay()函数,以防你们每个人都希望把它链接成某些东西。

答案 3 :(得分:1)

您需要添加一行以防止Click事件的默认操作发生。

$(".remove").click(function(event) {
  event.preventDefault();
  $("#dialog").dialog("open");

  ....
});

答案 4 :(得分:1)

快速点:

  1. “while”循环通过设置计时器或间隔回调来完成
  2. 更好的是,您可以将事件绑定到按钮或形成点击以测试刚刚发生的事情。
  3. 最好,看起来你正在使用jQuery UI,你可以设置一个单击对话框按钮时要调用的函数。

    $('form').dialog({
        autoOpen: true,
        buttons: {
            "Yes": onRequestSubmit, // function defined elsewhere
            "No": function () { $(this).dialog("close"); } // function defined here
        },
        modal: true
    });
    

答案 5 :(得分:1)

一个大问题仍然存在......为什么不在变量发生变化时检查变量的值?

我已经使用setTimeout()来延迟循环来检查服务器以执行伪服务器推送(这意味着浏览器向服务器发送请求)。即使每隔10秒,它也消耗了太多的CPU资源并大大降低了浏览器的响应速度(特别是对于廉价的车间机器)。

在处理javascript时,您必须从桌面.NET事件驱动编程中改变您的思维范式。持久循环对性能没有好处。

有两种选择:

设计应用程序流程,使您知道代码中可以更改变量的位置,并检查变量是否在代码中的任何一个点执行时更改。我知道,如果你来自C#,C或C ++,这似乎难以理解。

但是,我认为更好的选择是创建一个隐藏的文本输入HTML表单项。

<FORM NAME='dingoSam'>
 <INPUT TYPE='hidden' onChange='changed()' NAME='bingoSem'/>
</FORM>

我需要共享信号量的所有代码都会引用dingoSam.bingoSem来更改其值。

您应该利用浏览器的事件管理系统而不是创建自己的事件循环,因为javascript运行时利用其与OS进程的协作来优化其事件驱动程序。然而,用javascript编写的自己的事件循环远不是与OS进程的最佳协作。