FireFox下怪异的jQuery问题

williamxiao 2011-01-18 08:58:39
先贴上js代码:

//根据参数设置,每间隔5秒执行checkStat函数
setInterval(checkStat,5000);
function checkStat()
{
//异步请求指定的url
$.ajax({
url:"netstat.action",
success:function()
{
//alert("request success!textStatus:"+textStatus);
alert("request success!");
},
error:function()
{
alert("request error!");
}
});
}

需求:想通过页面显示网络连接状态;
实现:通过ajax异步请求服务器端的某个请求;
测试方式:启动web服务器后,在浏览器中开启显示网络状态的连接页面,5秒以后以上代码会弹出"request success!"信息,
关闭web服务器后,过5秒应该弹出"request error!"信息。
问题:以上jQuery代码在IE6及以上版本正常。但在FireFox下无论服务器下的web服务是否停止,还是服务器的网络断开,均回调success函数!!??

比较怪异,请高人指点?
...全文
208 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamxiao 2011-04-17
  • 打赏
  • 举报
回复
等待多日无果,结贴。~:
tianyidan 2011-01-21
  • 打赏
  • 举报
回复
旁听。。一样寻求结果。
williamxiao 2011-01-21
  • 打赏
  • 举报
回复
注意!上面回复中所提到的代码

$("body").everyTime(interval,"netstate",function(){});


是使用了jQuery定时器插件jQuery Timers,效果等同于:

setInterval(checkStatFun,interval);//checkStatFun为某一函数
williamxiao 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yjj3844 的回复:]

setInterval(checkStat,5000);
function checkStat()
{
//异步请求指定的url
jQuery.ajax({
url:"netstat.action",
success:function(f……
[/Quote]
谢谢10楼的建议,不过把$改成jQuery还是一样的.

我在做的是一个jQuery小插件,是希望能够直接在页面中显示网络连接状态.

1.页面是这样的:

<script type="text/javascript">
$(function(){
//使用自定义网络状态插件,每间隔2秒发送一个心跳至服务器
$("#netstat").netstate("2s","netstat.action");
});
</script>

<div id="netstat"></div>


2.插件是这样的:(版本2)

jQuery.fn.extend({
netstate:function(interval,url){
return this.each(function() {
var divObj = $(this);//div插件容器
var lable = $("<b>连接状态:</b>");//标签
//标签追加到插件容器中
divObj.append(lable);
//插件默认样式
divObj.removeClass();
divObj.addClass("img-offline");
//根据参数设置,每间隔一定时间执行函数
$("body").everyTime(interval,"netstate",function(){
//默认更改样式为离线
divObj.removeClass();
divObj.addClass("img-offline");
//异步请求指定的url
$.ajax({
url:url,
cache:false,
success:function(data, textStatus)
{
//!这里有Bug,如果请求服务器端的url返回data为空的话.
//请求成功则更改样式为在线
if(data)
{
divObj.removeClass();
divObj.addClass("img-online");
}
}
});
});
});
}
});


插件有两个参数:interval,url
interval:代表间隔时间(心跳时间);
url:表示请求服务器端的地址.

原本设计是:url可以是任意的地址,换成http://www.google.com.hk也是可以的,只是如果所请求的url是WEB应用服务器的地址时可以判断和WEB应用服务器的连接状态.而是其它网址时只能判断网络的连接状态.所以控件不应该依赖于某个固定的服务器地址,它应该被设计成可以请求任何url.

上面的插件代码是有问题的,我在success的回调函数里判断了返回的data是否为空,如果所请求的url返回的数据为空的话,就会认为连接状态为:离线.

3.在上一个版本中我的代码是这样的:(版本1)

jQuery.fn.extend({
netstate:function(interval,url){
return this.each(function() {
var divObj = $(this);//div插件容器
var lable = $("<b>连接状态:</b>");//标签
//标签追加到插件容器中
divObj.append(lable);
//插件默认样式
divObj.removeClass();
divObj.addClass("img-offline");
//根据参数设置,每间隔一定时间执行函数
$("body").everyTime(interval,"netstate",function(){
//默认更改样式为离线
divObj.removeClass();
divObj.addClass("img-offline");
//异步请求指定的url
$.ajax({
url:url,
cache:false,
success:function()
{
//更改为在线样式
divObj.removeClass();
divObj.addClass("img-online");
},
error:function()
{
//更改为离线样式
divObj.removeClass();
divObj.addClass("img-offline");
}
});
});
});
}
});


区别在于:
版本1的ajax请求错误时有回调函数处理样式为:离线样式

不过版本1在FireFox会有错,也就是我所说的:FireFox总是回调success的函数,无论是WEB服务器停止了也好,还是网络断开了也好,FireFox总是请求成功的.(并且没有firebug的错误)

我之所以改为版本2,在success回调函数中增加判断返回数据data的原因在于:网络断开或WEB服务器停止时,FireFox返回的data为空,可以以此来判断FireFox的连接是否正常.

这样做会存在bug,当所请求url的返回数据为空时状态就会显示错误。

所以还是希望能有方法解决FireFox为什么总是会回调success函数的问题?
williamxiao 2011-01-18
  • 打赏
  • 举报
回复
有答案吗?

在线等..........
williamxiao 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 meteors1113 的回复:]

建议在firefox下安装插件firebugs,可以调试你的js代码
[/Quote]
一直也都在用firebug调试js问题,确实是好东东。

不过这个问题在firebug下没有错误.比较奇怪的是为什么ff下的ajax请求总是success?
meteors1113 2011-01-18
  • 打赏
  • 举报
回复
建议在firefox下安装插件firebugs,可以调试你的js代码
williamxiao 2011-01-18
  • 打赏
  • 举报
回复
js的兼容性问题确实让人不太爽,现在我在使用的js基本都在用jQuery代替。
因为认为jQuery会解决这部分的兼容性问题,事实上大部分的兼容问题都可以通过jQuery来解决。
目前还只发现jQuery在ajax的时候会有浏览器的差异。

等待问题答案。
keke8247 2011-01-18
  • 打赏
  • 举报
回复
浏览器不兼容....
qunhao 2011-01-18
  • 打赏
  • 举报
回复
同一段代码在不同的浏览器总有不同的表现,这个是很郁闷的问题。
lizhepro 2011-01-18
  • 打赏
  • 举报
回复
打开firebug的Net面板


然后再进行你的测试,在Net面板里面,你可以看到浏览器怎么与服务器对话的
yjj3844 2011-01-18
  • 打赏
  • 举报
回复
setInterval(checkStat,5000);
function checkStat()
{
//异步请求指定的url
jQuery.ajax({
url:"netstat.action",
success:function(flag)
{
if(flag==1){//说明此时服务处于开启状态
alert("request success!");
}else{
alert("request error!");

}

}
});
}这样就可以显示了
这个是兼容性的问题
把$换成jQuery这样的话就可以了!
heardy 2011-01-18
  • 打赏
  • 举报
回复
想通过页面显示网络连接状态
你让前台传一个参数 或者 调用url的时候 打印一句话就OK了

到时候你不会让前台弹窗的吧

所以 后台接受到前台信息 就说明用户是连接状态

你是不是要通过此方法 做单点登录?
Ami121 2011-01-18
  • 打赏
  • 举报
回复
既然都返回SUCCESS 这样处理一下,让你的ACTION返回一个标识值 flag

/根据参数设置,每间隔5秒执行checkStat函数
setInterval(checkStat,5000);
function checkStat()
{
//异步请求指定的url
$.ajax({
url:"netstat.action",
success:function(flag)
{
if(flag==1){//说明此时服务处于开启状态
alert("request success!");
}else{
alert("request error!");

}

}
});
}



67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧