我一直试图让这个长的民意调查脚本工作,但我一直陷入困境。这次我对服务器的ajax请求有问题。提供数据的php脚本(使用循环和睡眠运行长轮询)完全正常,但我的jQuery脚本没有。
到目前为止,我已尝试对脚本使用正常的$.ajax()
请求和$.post()
请求,但是当我这样做时,整个脚本都会停止。好吧,脚本实际上加载了它应该,但页面显示它继续加载(使用谷歌浏览器它显示屏幕底部的“等待”栏)。在PHP脚本中60秒超时后,jQuery脚本收到“false”,因为没有找到数据。然后该脚本应该询问数据agian。
我的问题是:如何避免浏览器显示它在后台加载某些内容?我的服务器是一个共享服务器,因此我无法访问服务器本身的安装内容,因此必须使用javascript(jQuery)和php来解决。
编辑:刚刚在Internet Explorer中检查了我的脚本,它似乎没有显示脚本正在加载的任何迹象,但它仍然是谷歌Chrome中的一个问题
编辑发布一些代码:
这是我的javascript文件:
if($("#interestboard"))
{
var lasttime = $("#lasttime").val();
var pollurl = $("#pollurl").val();
lpStart();
}
function lpStart()
{
$.ajax({
type: "GET",
url: pollurl+lasttime,
async: true,
cache: false,
success:function(data)
{
alert(data);
},
error: function()
{
alert("Something went wrong");
}
});
}
当然这包含在$(document).ready()
我的php脚本如下所示:
while(time()-$time<60)
{
$this->class = $class["id"];
$this->orderBy("timestamp");
$this->_extraConditions = "`timestamp`>'$lastTime' AND ";
$result = $this->search();
if($result)
return $result;
usleep(250000);
clearstatcache();
}
使用firebug(使用Google Chrome)时,它只会显示已发出请求,但未在控制台的GET字符串末尾显示通常的加载图标。在Firefox中它还显示一个请求处于挂起状态(显示加载图标),但至少浏览器不像页面正在加载一样。
...谢谢
答案 0 :(得分:3)
我认为您应该阅读Chrome AJAX on page-load causes "busy cursor" to remain上的热门评论 - 它似乎是特定于Google Chrome的,您需要等待所有内容加载才能进行ajax调用。
编辑:只是推荐 - maby我错了:您不应该使用GET请求在您的网站上进行任何大型/敏感操作,因为它可能会导致您的网站轻松攻击。拥有/攻击某些高负载网站的任何人都可以在其网页中插入一个不可见的iframe,以便访问该网页的任何用户都可以在没有意识到的情况下发出该GET请求 - 它可能会导致服务器崩溃/损坏(因为有数千个请求来到您的网站)服务器)。大多数现代浏览器都不会允许跨站点POST请求,因此它应该是安全的。编辑2:关于您的网站无法使用,而该脚本即使在您中止后仍然有效:这很可能是因为会话。标准会话行为将只允许一个具有相同会话的php实例同时运行 - 所有其他请求将等待,直到该会话在所有其他脚本中关闭。你应该在脚本中尽快close the session,使用自定义会话处理来启用具有相同会话的多个请求(很可能这将非常难看)或detect user abort一旦用户中止它就关闭sript浏览器。