当前位置: 首页 > 面试题库 >

如何在浏览器中的同步ajax调用期间显示等待消息

颜黎昕
2023-03-14
问题内容

如何在浏览器中的同步ajax调用中显示等待消息?我在下面尝试了代码,关闭了Web服务器,但未显示“正在保存”消息。

一段时间后,只会发生来自ajax调用的错误事件,而没有任何进度消息。

如果正在进行同步Ajax调用,如何向用户显示等待消息?

var myInfo = '<div class="ui-state-highlight ui-corner-all" style="position: fixed;' +
    'z-index: 10000; margin-top: 2%; margin-left: 2%">' +
    ' <br />' +
    '&nbsp;<span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>' +
    '<strong>Saving</strong>&nbsp;<br />' +
    '<br /></div>'
$('#_info').html(myInfo);
$('#_info').show();

$.ajax( 'save',
   {
       async: false,
       type: 'POST'
    } );

问题答案:

您的问题是您使用的是同步AJAX调用,并且在浏览器完成之前几乎将其锁定。尤其是,在您按下$.ajax({async:false})锁定键之前,浏览器将无法显示您的“正在加载”消息;例如,观察它的作用:

http://jsfiddle.net/ambiguous/xAdk5/

注意,在运行AJAX时,按钮甚至还没有恢复为未单击的可视状态?

解决方案是显示加载消息,将控制权交还给浏览器,然后通过同步远程调用锁定所有内容。一种方法是使用setTimeout零延迟:

$('#_info').html(myInfo);
$('#_info').show();
setTimeout(function() {
    $.ajax('save', {
        async: false,
        type: 'POST',
        complete: function() {
          $('#_info').hide();
        }
    });
}, 0);

例如:http :
//jsfiddle.net/ambiguous/zLnED/

当然,需要注意一些事情,因为回调this内部与setTimeout外部不会完全相同,但是很容易处理。

但是,使用对用户async:false来说并不是一件好事,除非绝对必要(很少如此),否则应避免使用它。



 类似资料:
  • 问题内容: 我想做的是将加载图像添加到div(以便用户知道正在加载某些内容),然后调用jquery ajax函数,该函数设置为“ async:false”。这是我的代码: 问题在于,浏览器将锁定,并且在ajax调用完成后才追加加载图像,这当然是没有用的。Firefox是唯一实际附加加载图像的浏览器。IE,Chrome和Safari请勿附加正在加载的图片。 我知道浏览器锁定会发生,因为async设置

  • 问题内容: 最近,我不得不更正Web应用程序(我没有创建)中的安全性问题。安全问题是,它正在使用非仅限HTTP的cookie。因此,我不得不将session- cookie设置为仅http-,这意味着您无法再从javascript中读取(设置)cookie的值。到目前为止,接缝都很容易。 更深层的问题是,使用的Web应用程序 在一百万个地方 。 因此,为了不必重写“一百万行代码”,我不得不创建一个

  • 问题内容: 为了使IM Client始终保持登录状态,Facebook通过在将页面插入文档之前使用AJAX加载页面来避免整个页面加载。 但是,在Facebook AJAX请求期间,浏览器似乎正在加载。重新加载按钮变为X,浏览器中内置的进度指示器指示正在加载/正在等待等) 我已经能够成功实现基于AJAX的导航,但是我的浏览器没有显示任何加载迹象(由于请求是异步的),Facebook如何做到这一点?

  • 问题内容: 在服务器回答请求之前,浏览器需要等待多长时间才能显示错误?这次可以无限吗? 问题答案: 如果使用的是jQuery $ .ajax调用,则可以设置timeout属性以控制请求以超时状态返回之前的时间。超时设置为毫秒,因此只需将其设置为很高的值即可。您也可以将其设置为0(表示“无限”),但我认为您应该设置一个较高的值。 注意:“无限制” 实际上是默认设置,但大多数浏览器都有默认超时值。 当

  • 问题内容: 在我的servlet中,我使用下面的代码在浏览器中打开PDF文件,但是,它显示了一个下载对话框。 我做错了什么? 问题答案: 你可以尝试用

  • 问题内容: 示例:转到Facebook墙,滚动页面的末尾,Facebook将 异步 加载更多墙帖。或者,只需单击墙上的帖子中的图片即可。图像对话框(带有注释和较大图像)也将 异步 加载。(您可以使用firebug查看GET请求)。 但是通过查看和Firefox标签,您会看到加载指示器,就像发生回发时一样。 我知道可以通过使用an 并更改其src 来实现。就像iGoogle一样。但是我不确定Face