0

我试图在使用 JQuery 执行 AJAX 调用时向用户显示一个对话框。我需要将调用设为“async:false”,因为页面的其他部分依赖于数据,并且我无法在“成功”字段中包含所有需要的代码。

使用 Firefox 和 Opera,对话框可以正常显示,但是在 IE 和 Chrome 中,它会等到页面完全呈现并且根本不显示对话框。这是一个非常接近实际实现的示例,这是一个更大的项目,我试图将其剥离到所涉及的最低限度。

http://jsfiddle.net/mcraig_brs/eNMna/

我想找到一种在启动 ajax 调用之前显示对话框并在完成后关闭对话框的方法。AJAX 调用必须保持“async: false”。这可能吗?我该怎么做?

任何帮助,将不胜感激。最终答案需要在 IE8/9、Firefox 和 Chrome 中运行。Opera 和 Safari 将是额外的 :)

作为对其中一个回复的回应,我修改了小提琴以显示我的意思:

http://jsfiddle.net/mcraig_brs/BBhdS/

4

2 回答 2

1

在文档准备好后尝试运行所有代码:

$(function(){
  var page = new pageManager();
  page.LoadData();
});

如果代码在文档完全准备好之前执行,一些 jQuery 的选择器(例如,$("#dialog"))可能没有效果,因为元素还没有准备好。这取决于浏览器如何构建页面与元素的排序方式等。

于 2012-06-11T19:13:04.937 回答
0

这里的问题是 jQuery UI 的对话框打开函数本身是异步运行的(以处理打开对话框时可能需要发生的动画)。因此,要使其正确运行,您需要您的代码在dialogopen事件处理程序中运行。

现场示例- http://jsfiddle.net/tj_vantoll/YR7RC/

话虽如此,我强烈反对使用同步 XHR 请求。从长远来看,它们会使您的代码的可维护性大大降低。使用 jQuery 的延迟,您可以在 AJAX 调用完成后将多个函数排队运行。这里有一篇关于这项技术的优秀文章 - http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/

于 2012-06-12T01:16:27.260 回答