【问题标题】:Will javascript pause for a return value?javascript会暂停返回值吗?
【发布时间】:2014-01-22 17:47:18
【问题描述】:

我想在我的网站上创建一个自定义确认框。

  1. 能否将事件处理程序绑定到匿名函数中。
  2. javascript 会等待返回值还是在 执行中超时/暂停。
  3. 是否可以使用确认框 延迟对象?我很难把如何 延迟对象工作以及如何实现它们。会以下 理论上可行吗?

HTML

<div id='box'>
   <button id='confirm'></button>
</div>
<button id='startConfirmation'></div>

javascript (jquery)

$('#startConfirmation').click(function()
{
   if(buttonClicked())
   {
      //do stuff
   }
});
function buttonClicked()
{
   return $('#confirm').click(function()
          {
             return true;
          });
}

【问题讨论】:

  • 恐怕这不可能。好吧,有一些可怕的、骇人听闻的方法,但我建议你硬着头皮研究使用回调函数。一旦你了解了异步的做事方式,你就永远不会回头。
  • 不,这不是事件处理程序的工作方式。如果您想等待,我建议您使用confirm
  • return value in jQuery event handlers 用于停止事件的传播。在您的示例中,buttonClicked 函数的返回值只是 jQuery 对象,它将与 return $('#confirm'); 相同,除非您将事件处理程序也附加到该对象。
  • 不,这不起作用,因为代码不会等到按钮被点击。
  • 在伪代码中,你真正想要的是...$('#startConfirmation').click(function() { showConfirmationDialog(); });$('#confirm').click(function() { // do stuff here });

标签: javascript jquery


【解决方案1】:

事件处理程序可以绑定在匿名函数中吗?

是的。

在执行超时/暂停后,javascript 会等待返回值还是返回 null/false。

没有。

延迟对象是否可以使用确认框?

是的。

我很难将延迟对象的工作原理以及如何实现它们放在一起。

它们仍然是异步的,这意味着您不能简单地调用一个函数并 return 从中获取值。它们只是允许更轻松地链接多个异步任务。

以下在理论上可行吗?

不,正如我刚才所说 - buttonClicked() 几乎无法返回有用的值。它可能有某种内部存储,并返回一个布尔值是否按钮至少被点击一次,但我认为这不是你想要的。

使用延迟,它更可能看起来像这样:

function buttonClicked() {
    var deferred = $.Deferred();
    $('#confirm').one("click", deferred.fulfill);
    // maybe reject at [ESC] or when hitting a close button?
    return deferred.promise;
}

$('#startConfirmation').click(function() {
    // every time the start button is hit
    buttonClicked().then(function() {
        // do stuff (maybe return another promise)
    }).always(closeDialogue);
});

【讨论】:

  • 应该是“on”而不是一个吗?
  • @Craig:不,它应该是一个one——承诺没有多次实现。其实我想把这个方法命名为.once() :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多