1

当我的网站与我的 AJAX 服务器通信时,我试图在屏幕中间显示一个弹出窗口。由于某些操作需要几秒钟才能完成,我想给我的用户一个操作正在发生的视觉提示。例如,您可以在我的网站上创建一个音乐播放列表。创建播放列表时,我希望弹出一个 div,说明它正在我的服务器上创建播放列表。

我做了一个jsfiddle来展示我用来尝试产生这个的函数,但我有一点相反的效果。在小提琴中,它在尝试与服务器交谈后显示弹出窗口(它将无法与服务器交谈,因为我拒绝在我的域之外的任何内容),但由于它无法与服务器交谈,它永远不会调用hide_popup().

在我的服务器上,它甚至从不显示弹出窗口(除非我在通话alert()后直接show_popup()调用)。

我不确定为什么会发生这种情况,但我只是想
1. 显示弹出窗口
2. 执行我的 AJAX 调用
3. 隐藏弹出窗口

有什么建议么?

4

2 回答 2

1

您编写代码的方式存在一些问题。以下是其中的几个:

(1.)致电

var response = get_server_response("action=createPlaylist&name=" + name, false);

您期望立即得到响应,而 AJAX 调用不会发生这种响应。此外,您正在传递参数falseasync这使其有效地成为sync调用。这就是为什么你的代码在做任何其他事情之前只是在等待。

(2.)实施

xmlhttp.onreadystatechange = function()
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        response = xmlhttp.responseText;
    }
}
xmlhttp.open("POST", ajax_server, async);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(url);
return response;

您只是将结果缓存在其中,response而不是在跟踪时对其进行处理onreadystatechange。您实际上是在调用之后处理它,这将在调用之后执行,而不是在收到响应时执行。无需在此处返回响应。

(3)弹出

您没有在适当的地方使用显示/隐藏。

解决方案

我建议您在onreadystatechange通过实现函数来跟踪时触发回调。在进行网络调用之前显示弹出窗口。根据readyStateand将其隐藏在回调函数中status

这是一个适合你的小提琴:http: //jsfiddle.net/nDNXc/549/

希望有帮助。

于 2013-09-17T14:22:04.410 回答
0

首先,我建议您对 Ajax 调用使用通用库,例如​​ jQuery.ajax

其次了解异步Javascript。您对 get_server_response() 的调用会立即返回,而无需等待您的 Ajax 请求完成。查看 jQuery.ajax 中的完整参数。它接受一个在您的请求完成时调用的函数 - 隐藏您的消息的正确位置!

于 2013-09-17T14:21:52.130 回答