当页面关闭时向后台发送请求

今天做项目时遇上一个需求,当浏览器或页面关闭时将数据存储到数据库内。实现思想是采用js监测onunload然后发送请求。结果失败,刷新可以发送但是关闭并不能,最终整了一整天并没有解决,最后找到了解决办法。

先贴个能实现功能的方法:

 1 function saveStatus(){
 2     /*结束时保存设备状态*/
 3     window.onbeforeunload=function(){//必须使用beforeunload
 4         var url ="device_saveDeviceStatus";
 5         $.ajax({
 6             url:url,
 7             async:false                //必须采用同步方法
 8         });
 9     }
10 }
11 saveStatus();

接下来来解释一下:

  1.一开始的想法是采用onunload方法,但最后经过查询,需要使用onbeforeunload方法。它们之间的区别在于:onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。onunload是无法阻止页面的更新和关闭的。而 onbeforeunload 可以做到。

  2.在发送请求上,一开始采用简单的$.post(),但是$.post()是异步的方法,不行。为什么这里不能采用异步方法呢?我的理解是,如果采用异步方法,那么浏览器会在方法成功发送并响应前先unload,从而导致请求丢失。如果采用的是同步方法,浏览器就会等待请求成功,然后再unload。按照这个理解,如果采用异步方法发送后,再采用alert()进行拦截等待,应该也是可以的,只是这个方法太影响体验,所以抛弃。

  附:提供一个替代的想法,在j2ee开发中,可以采用监听器监听session的销毁事件,达到类似的效果。

时间: 2024-10-18 02:42:26

当页面关闭时向后台发送请求的相关文章

java后台发送请求并获取返回值(续)

在java后端发送请求给另一个平台,从而给前端实现 "透传"的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀疑是编码格式或透传过程中处理的问题,将编码格式进行了设置并查资料了解了一下透传过程中代码的处理方法,虽然最后发现是前后端定义的json串的属性名称不一致导致(后端传输数据中属性名label写成了lable...),但在此还是记录一下"透传"处理过程中处理数据流的三种方式. 主要是介绍经常用

前端向后台发送请求有几种方式?

1. link标签的href属性 2. script标签的src属性 3. img标签的src属性 4. ajax发送请求 5. 表单提交发送请求 6. a标签的href发送请求 7. iframe的src属性发送请求

后台发送请求,HttpClient的post,get各种请求,带header的请求

HttpClient依赖jar包: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> 写一个发送请求的工具类HttpUtil package com.bs.utils; import java.io

页面关闭时触发的时间

//绑定beforeunload事件 added by fanghui 2015.1.8 $(window).bind('beforeunload',function(){ $.removeCookie("userSelectedActCertificate"); $.removeCookie("uerSelectedInvestmentAmount"); });

页面发送请求到后台报错“Empty or invalid anti forgery header token.”问题解决

在页面向后台发送请求时,报如上图的错误的解决办法: 在WebModule.cs类中的PreInitialize方法中加 Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false; 另外还有添加引用: using Abp.Configuration.Startup; 出现这个问题的原因是没有使用abp.ajax的请求方式,而是使用其他的方式 另外还有其他的解决办法: 1.在Controller的Action里标注:[DisableAb

关于页面传参到后台中文乱码的处理

有时候,我们在前端页面像后台发送请求的时候需要携带的参数是中文,可能会出现乱码,下面是处理中文乱码的方法: JSP/HTML 中的请求: user/getUsersByName.do?name=encodeURIComponent(name); 用 encodeURIComponent 对中文进行编码: JAVA后台代码: String userName= new String(request.getParameter("entityName").getBytes("ISO-

Android客户端连接服务器端,向服务器端发送请求HttpURLConnection

在Java中想后台服务器发送请求一般都直接使用了Java的网络编程,或者使用HttpClient向后台服务器端发送HTTP请求.虽然在安卓中,所有Java的API都可以使用,而却使用其并不会出现什么问题,但是HttpClient毕竟是基于Java标准实现的一个类,在安卓中,想要连接后台服务器端,专门基于android实现了一个类,为HttpURLConnection.通过HttpURLConnection,我们可以实现向服务器端发送HTTP请求,连通后台服务器和客户端. 这几天刚好在做andro

控制非模态弹出框(showModelessDialog)唯一且随父页面关闭

网站开发中,常常会遇到需要弹出窗体的情况,一般弹出框有模态和非模态两种,如下: 模态:window.showModalDialog() 非模态:window.showModelessDialog() 另外还有window.open 方法,以及通过div来模拟弹出框效果的形式. window.open请自行百度,了解不深:div模拟的方式不适用与,弹出框中某些组件与父页面组件不相容的情况,如笔者所在项目,父页面中的jquery与整个网站js框架不相容(当然不是简单的可以通过替换$关键字来解决).所

刷新或关闭时调用onbeforeunload

Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload来指定或者在<body>里指定.区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行.  Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取:而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时