【问题标题】:javascript WAIT for something to be truejavascript 等待某事为真
【发布时间】:2011-03-24 12:33:02
【问题描述】:

我在 javascript 函数中创建了一个原型窗口。在窗口中,我加载了一个用户必须选择某些内容的站点。我希望 javascript 函数等到用户选择了某些内容,然后返回用户选择的内容的值。

function showTargetDirectoryChooser(){
  var win = new Window( 'dirchooser_' + new Date().getTime() , {className: 'alphacube', width: 320, height: 470, url: '/directories/choose', maximizable: false});
  win.showCenter();
  win.setDestroyOnClose();

  // WAIT_UNTIL( win.content.contentWindow.Directory != null )

  return win.content.contentWindow.Directory
}

我找到了 here 我可以使用的东西 - 但我不明白如何...

【问题讨论】:

  • 如果您使用Prototype 库,您可以使用periodicalExecuter 实用程序每隔5 秒轮询win.content.contentWindow.Directory 的状态。
  • 这并不真正适合我的问题,我希望用户使用一个按钮来表示他已完成选择...

标签: javascript conditional-statements wait


【解决方案1】:

这是一个异步过程;最好用回调来处理。

例如,你不能使用closeCallback吗?

function showTargetDirectoryChooser(done){
  var win = new Window( 'dirchooser_' + new Date().getTime() , {className: 'alphacube', width: 320, height: 470, url: '/directories/choose', maximizable: false});
  win.showCenter();
  win.setDestroyOnClose();

  // This will ensure 
  win.setCloseCallback(function () {
      done(win.content.contentWindow.Directory);
      return true; // or return false if you don't want the window to be closed
  });

  return true;
}

有了这个,你会改变

var chosenDir = showTargetDirectoryChooser();
// do something with chosen directory

进入

var chosenDir;
showTargetDirectoryChooser(function (directory) {
    chosenDir = directory;
    // do something with the chosen directory
});

【讨论】:

  • 如何在窗口中制作按钮关闭窗口?
  • @klump: <button onclick="this.close()">OK</button>
  • Uncaught TypeError: Object #<an HTMLButtonElement> has no method 'close' 不起作用。如我所见,我必须调用win.close();,但窗口中没有变量win...
  • @klump:啊,我真傻!我的意思是<button onclick="window.close()">OK</button>...win 是您的函数中定义的变量,但在窗口本身中,它可以通过window 变量访问。
  • 嗯。现在错误消息消失了,但窗口没有关闭。我还是要点击十字架...
【解决方案2】:

一种选择是使用事件处理程序。当Directory 通过单击或更改事件设置时,如果触发了该事件,请附加一个处理程序,该处理程序接受该事件并将其传递回主窗口中的函数。这将需要使您的代码异步 - 以便您有一个调用 showTargetDirectoryChooser() 的调用者和一个将目录结果作为单独函数的回调。不过,在那里重新构建代码并将其分解为调用者和回调应该不会太复杂。

您也可以使用 setTimeout 并像这样轮询win.content.contentWindow.Directory 的内容:

function showTargetDirectoryChooser(){
  var win = new Window( 'dirchooser_' + new Date().getTime() , {className: 'alphacube', width: 320, height: 470, url: '/directories/choose', maximizable: false});
  win.showCenter();
  win.setDestroyOnClose();

  setTimeout("pollDirectory()", 500); // poll in a half second
}

function pollDirectory() {
  if(win.content.contentWindow.Directory != null) {
    callback(win.content.contentWindow.Directory); // you will need an asynch callback
  } else {
    setTimeout("pollDirectory()", 500); // poll in a half second
  }

}

这样做还要求您的代码是异步的。

另一种选择是查看 jquery wait,但这是超时而不是等待条件。或者有一组reactive extensions to JS,但这看起来对你正在做的事情来说太过分了。不过,observable 的概念可能是您想要研究的。

【讨论】:

  • mhh 我发现我需要超时。我希望我可以跳过它,但似乎并非如此。我会试试你的答案。
  • @klump - 我实际上建议做一个事件(不确定你的选择器的结构,所以我不知道它已经触发了哪些事件,或者你是否必须编写一个自定义事件) 和回调而不是超时,但是因为我可以编写超时代码。如果我有你的选择器的代码,我会编写一个事件处理程序。它更干净。
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2014-08-26
  • 2016-10-10
相关资源
最近更新 更多