如何在Javascript onunload元素中进行异步调用?

时间:2009-02-16 15:59:51

标签: asp.net javascript html

我有一个系统,当用户查看该项目时,项目被锁定(在数据库中有一个标志)。

目前,只有当用户执行某项操作时才会解锁该项目。

但是,当用户通过任何方法离开页面时,我想调用一个解锁项目的webservice / ashx页面,但不会阻止页面更改。

5 个答案:

答案 0 :(得分:2)

你所描述的是不可能的。 JavaScript线程/运行时存在于加载页面的范围内,因此当页面卸载时,JavaScript也会被卸载。当异步调用返回并且浏览器离开页面时,用户将收到JS错误。

您可以使您的Web服务/ AJAX调用同步并阻塞,直到服务器返回响应,但这当然意味着页面将在卸载之前等待响应。

答案 1 :(得分:2)

使用“心跳”功能在页面加载时保持锁定活动怎么样?每隔一段时间拨打一次服务器电话,比方说15秒左右,以更新锁定。编写服务器端代码,以便锁定在20秒后超时,如果它没有从页面听到“心跳”。当用户离开页面时,心跳将停止,锁定将在最多20秒后释放。

答案 2 :(得分:1)

我设法通过使用body onbeforeunload事件在IE7和Firefox 3中使用它。我使用XmlHttpHandler调用一个解锁查询的asp.net http处理程序。我必须将状态更改事件处理程序设置为null,以便返回时没有javascript错误。

事件触发并且页面发生变化,而不是延迟用户。

答案 3 :(得分:0)

我认为您应该能够对服务器进行同步XHR调用。

如果你正在使用jQuery:

$.ajax({
  async:false,
  url:"your_page.html",
  data:"unlock=true",
  type:"POST"
}).responseText;

因为它不是异步的,理论上它应该暂停浏览器执行,直到返回此调用的结果。

答案 4 :(得分:0)

这可以使用 Beacon API 解决。

更多相关信息here