先回答题主的问题:
我个人的理解中,浏览器没有离开页面时的事件,那么也就无法知道是“刷新”或“关闭”
但是有一个比较抖机灵的解决方案
支持H5的浏览器会有一个Session Storage
这个东西每个浏览器标签是独立的,只要浏览器标签没有被关闭就会一直存在,即使有多个同源的标签页面存在,也是独立的,思路大概是这样的。
页面打开,检查Session storage 的某个你制定的Key是否存在,
如果存在,证明是刷新,执行你要刷新时的操作。
如果不存在,证明新打开的,执行你的离开的操作,然后写入指定的Key。
当然这种方案有一个弊端,就是无法让服务端及时发现。必须等下次页面再打开才能发现上次被关闭。
没有办法及时发现浏览器端的状态。
因为Http本身就是无状态的,一次http(Tcp)交互就完成三次握手就OK了。
如果你是让服务器端发现用户是不是已经关闭页面,那么可以尝试一下WebSocket进行长连接,一旦断开服务器端会触发断开事件,但是这种方案需要在刷新的时候做一些手脚。因为无论刷新和离开,都会造成断开。
如果不需要websocket这么灵敏的话,可以尝试用轮询解决
这个在window.load之后才有用,window.unload的时候不起作用
要实现的功能是,当页面关闭时,用户退出,刷新时不做操作,window.unload执行在window.load之前