关闭IE时调用AJAX来和后台交互,必须要加ALERT,不然就不行,很奇怪

小瑞 2009-04-15 07:07:14
我想实现的就是用户关闭IE时,执行onbeforeunload方法,然后把返回值传给SERVLET,然后由SERVLET操作把值返回给页面,如果返回0就不提示,直接关闭,如果非0就alert出后台的提示信息,然后关闭,现在问题就是加alert("结束 "+retCode);这一行就可以实现,去掉这一行就不行


//关闭IE时进行使用AJAX与后台的交互
var winClose = true;
function window.onbeforeunload()
{
//关闭IE时不弹出提示按钮
window.opener = null;
winClose = event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey;
//关闭
if(winClose)
{
doRequestUsingPOST();
  }
}

//使用post方式发送
function doRequestUsingPOST()
{
createXMLHttpRequest();
var retCode = document.getElementById("retCode").value;
var queryString = "retCode="+retCode;
var url="./AJAXtest"; //使用URL向后台传值
xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send(queryString);
alert("结束 "+retCode);
}



请高手说一下,急用,
...全文
427 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenggs 2010-09-24
  • 打赏
  • 举报
回复
我也出了这问题
stonedzb 2010-08-20
  • 打赏
  • 举报
回复
我也碰到了同样的问题,怎么我把true改成false就不行了
lzj34 2009-04-18
  • 打赏
  • 举报
回复
Ajax在网页中最大的一个优点是它可以访问服务器上的信息而不需要重新加载网页。这意味着要检索或是更新信息的某一小个部分的时候,只需要从服务器端传送那一部分需要的信息而不需要重新下载整个网页。

  Ajax可以通过两种方法访问服务器,即同步(脚本会停留并等待服务器发送回复然后再继续)和异步(脚本允许页面继续其进程并处理可能的回复)。

  同步处理你的请求有一点像重新加载页面但是只需要下载要求的信息而不是整个页面。因此这一方法会比不使用Ajax要快一些因为信息的下载量要小,所以检索的速度就快了。但是要使用这个方法需要你的访客等待下载请求的出现。虽然你的访客已经习惯了等待下载整个页面,但是他们还不习惯在与网页互动的时候进行等待,因此除非你要求的信息是小到可以迅速下载完的,否则用户是不会耐心去等待的。

  异步处理避免了服务器检索时候的延时问题,因为你的访客可以继续在页面进行操作,而要求的信息也可以在更新页面的同时得到处理。对于较大的请求来说,所需的响应时间较长,但是如果使用异步处理,那么访客不会特别意识到延时所带来的麻烦,因为他们的注意力仍然放在对页面的操作上。而对于那些瞬时的响应,你的访客甚至根本不会意识到服务器发出了这样的请求。

  因此使用异步调用是Ajax中比较受青睐的方法,这种方法可以为访客的访问提供更便捷的服务,使得他们更愉悦,也避免了Ajax干扰其他页面的操作。

  如果异步调用对于访客来说是可以提供比同步调用更方便的访问的话,那么为什么Ajax还要为我们提供同步调用呢?虽然异步调用的使用率几乎是百分之百,但是总是有一些例外情况的。在极少见的情况下,让你的访客在某一特定服务器端的处理过程结束前,让你的访客继续操作页面是没有什么意义的。如果是碰到这样的情况,或许根本不要使用Ajax而只是重新载入整个页面。Ajax中的同步选择是为极少数既不能使用异步调用也不能重新载入整个页面的情况而准备的。虽然这样的情况不多,但是它们确确实实存在,因此为以防万一Ajax需要准备同步调用。

  对于很多初学者来说,容易掉入使用同步调用的误区,即便是在更适合使用异步调用的时候,他们还是一如既往地选择同步调用。造成这一情况的原因主要是因为同步调用更容易让人理解整个进程是怎样运行的。事实上,除了不需要等待响应以外,异步调用的工作原理和同步调用大同小异。

  两者唯一的区别是在使用异步调用的时候,我们可以设置多个Ajax调用,这个调用是重叠的,即在前一个还没有响应的时候就可以发出第二个调用。这就异步调用比同步调用看上去要复杂一些的原因,因为你需要确定每个Ajax请求使用的都是单独的Ajax对象而不是所有的Ajaz请求都重复使用相同的对象。如果多个异步调用使用的是同一个对象那么响应处理器只会处理收到的第一个响应,而且会忽视其他后续响应。使用带有相同对象的重叠的Ajax调用,我们没有一个确凿的方法可以分辨出究竟哪个响应被处理了,也不知道该响应是否与发出的请求顺序一致。而为每个Ajax调用使用单独的对象,我们就可以获得相应的响应,响应处理器也能够准确对它们进行分辨。

  异步使用Ajax对于大多数情况来说都是更好的选择。如果你只需从页面发出一个Ajax调用,那么,除了那个指定要怎样处理调用的参数以外,其编码方式和同步调用没有什么不同。在相同页面使用多个Ajax调用,唯一的复杂的地方是你需要为每个请求创建一个单独的Ajax对象。各种类型的Ajax库可以为你做好这样,唯一需要你编写异步调用代码的情况是你需要与同步调用不同的操作。
小瑞 2009-04-18
  • 打赏
  • 举报
回复
没人拉,周日封贴
小瑞 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mrshelly 的回复:]
这个参数.确认是同步还是异步通讯.

AJAX嘛.就是异步了.
[/Quote]


同步还是异步通讯的具体区别呢
老黄瓜_ 2009-04-17
  • 打赏
  • 举报
回复
同步问题。。
小瑞 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jingshuaizh 的回复:]
关注 顶 是否可以把 alert("结束 "+retCode);
改成 var 1=20; 试试可以否
[/Quote]

哥们不行啊,加你这一句var 1=20;,JS页面就报错了,
呵呵
我修改成了,

//使用post方式发送
function doRequestUsingPOST()
{
createXMLHttpRequest();
var retCode = document.getElementById("retCode").value;
var queryString = "retCode="+retCode;
var url="./AJAXtest"; //使用URL向后台传值
xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
alert("111");
xmlHttp.send(queryString);
//alert("结束 "+retCode);
retCode = 0;
}



然后运行到了xmlHttp.send(queryString); 就没有了,
但是后台servlet得到值了

控件返回值retCode 0


说明他和后台交互了,但是后台不能把值传给前台
mrshelly 2009-04-16
  • 打赏
  • 举报
回复
这个参数.确认是同步还是异步通讯.

AJAX嘛.就是异步了.
小瑞 2009-04-16
  • 打赏
  • 举报
回复
先不结贴,再看看有没有专家有别的建议
小瑞 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shangxb 的回复:]
更正。。。把红色的部分改成false
xmlHttp.open("POST",url,false);
[/Quote]

恩,可以了,多谢啊
shangxb 2009-04-16
  • 打赏
  • 举报
回复
更正。。。把红色的部分改成false
xmlHttp.open("POST",url,false);
shangxb 2009-04-16
  • 打赏
  • 举报
回复
因为你使用的是异步请求 当执行完xmlHttp.send(queryString);后 程序是不会等待服务器返回结果的 而是直接往下执行了 so....
你可以把xmlHttp.open("POST",url,true)改成xmlHttp.open("POST",url,true)试下
蓝海D鱼 2009-04-15
  • 打赏
  • 举报
回复
关注 顶 是否可以把 alert("结束 "+retCode);
改成 var 1=20; 试试可以否
小瑞 2009-04-15
  • 打赏
  • 举报
回复

//使用post方式发送
function doRequestUsingPOST()
{ alert("111");
createXMLHttpRequest();
alert("222");
var retCode = document.getElementById("retCode").value;
alert("3333");
var queryString = "retCode="+retCode;
alert("444");
var url="./AJAXtest"; //使用URL向后台传值
alert("555");
xmlHttp.open("POST",url,true);
alert("6666");
xmlHttp.onreadystatechange = handleStateChange;
alert("777");
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
alert("888");
xmlHttp.send(queryString);
alert("999");
// alert("结束 "+retCode);
}


用alert("999");代替也可以,注释掉alert("999");也是出问题,程序弹出888之后就没有了,页面关闭了

52,782

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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