淺談javascript中onbeforeunload與onunload事件
在最近的項(xiàng)目中,需要做到一個(gè)時(shí)間,就是用戶離開頁(yè)面的時(shí)候,我需要緩存頁(yè)面其中一部分的內(nèi)容,但是我不需要用戶刷新的時(shí)候也緩存,我只希望在我用戶離開的時(shí)候
執(zhí)行這個(gè)函數(shù)。百度之,有onbeforeunload與onunload這兩個(gè)事件,但是onbeforeunload在用戶刷新的時(shí)候也會(huì)執(zhí)行。搞得我弄的挺久的,所以想在這里做一個(gè)小小的總結(jié)
onbeforeunload與onunload事件
onbeforeunload定義和用法
onbeforeunload 事件在即將離開當(dāng)前頁(yè)面(刷新或關(guān)閉)時(shí)觸發(fā)。
該事件可用于彈出對(duì)話框,提示用戶是繼續(xù)瀏覽頁(yè)面還是離開當(dāng)前頁(yè)面。
對(duì)話框默認(rèn)的提示信息根據(jù)不同的瀏覽器有所不同,標(biāo)準(zhǔn)的信息類似 "確定要離開此頁(yè)嗎?"。該信息不能刪除。
但你可以自定義一些消息提示與標(biāo)準(zhǔn)信息一起顯示在對(duì)話框。
注意: 如果你沒有在 <body> 元素上指定 onbeforeunload 事件,則需要在 window 對(duì)象上添加事件,并使用 returnValue 屬性創(chuàng)建自定義信息(查看以下語法實(shí)例)。
注意: 在 Firefox 瀏覽器中,只顯示默認(rèn)提醒信息(不顯示自定義信息)。
使用方法:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body onbeforeunload="return test()"> </body> <script type="text/javascript"> function test(){ return "你確定要離開嗎"; } </script> </html>
或者:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> </body> <script type="text/javascript"> window.onbeforeunload=function(){ return "你確定要離開嗎"; } </script> </html>
事件觸發(fā)的時(shí)候彈出一個(gè)有確定和取消的對(duì)話框,確定則離開頁(yè)面,取消則繼續(xù)待在本頁(yè)。當(dāng)然你可以自定義提示文本。
那么,當(dāng)我只需要在我離開時(shí)執(zhí)行這個(gè)函數(shù),而刷新的時(shí)候不執(zhí)行,那怎么做呢?
window.onbeforeunload = function() { var n = window.event.screenX - window.screenLeft; var b = n > document.documentElement.scrollWidth - 20; if (!(b && window.event.clientY < 0 || window.event.altKey)) { //window.event.returnValue = "真的要刷新頁(yè)面么?"; //這里放置我想執(zhí)行緩存的代碼 cacheFunction(); } }
這樣,我離開頁(yè)面時(shí),可以執(zhí)行我的緩存代碼,而不彈出提示框,我刷新時(shí)也不彈出提示框,也不執(zhí)行。值得一提的時(shí),這個(gè)時(shí)候,要將ajax設(shè)置為同步,即:ajax里面的 async改為: false;
瀏覽器兼容情況
IE、Chrome、Safari 完美支持
Firefox 不支持文字提醒信息
Opera 不支持
IE6,IE7 使用 onbeforeunload 遇到的bug
2、onunload定義和用法
onunload 事件在用戶退出頁(yè)面時(shí)發(fā)生。
使用方法和onbeforeunload類似
window.onunload = function(){ return "你確定要離開嗎" }
瀏覽器兼容情況
IE6,IE7,IE8 中 刷新頁(yè)面、關(guān)閉瀏覽器之后、頁(yè)面跳轉(zhuǎn)之后都會(huì)執(zhí)行;
IE9 刷新頁(yè)面 會(huì)執(zhí)行,頁(yè)面跳轉(zhuǎn)、關(guān)閉瀏覽器不能執(zhí)行;
firefox(包括firefox3.6) 關(guān)閉標(biāo)簽之后、頁(yè)面跳轉(zhuǎn)之后、刷新頁(yè)面之后能執(zhí)行,但關(guān)閉瀏覽器不能執(zhí)行;
Safari 刷新頁(yè)面、頁(yè)面跳轉(zhuǎn)之后會(huì)執(zhí)行,但關(guān)閉瀏覽器不能執(zhí)行;
Opera、Chrome 任何情況都不執(zhí)行。
總結(jié)
Onunload,onbeforeunload都是在刷新或關(guān)閉時(shí)調(diào)用,可以在<script>腳本中通過window.onunload來指定或者在<body>里指定。區(qū)別在于onbeforeunload在onunload之前執(zhí)行,它還可以阻止onunload的執(zhí)行。
Onbeforeunload也是在頁(yè)面刷新或關(guān)閉時(shí)調(diào)用,Onbeforeunload是正要去服務(wù)器讀取新的頁(yè)面時(shí)調(diào)用,此時(shí)還沒開始讀取;而onunload則已經(jīng)從服務(wù)器上讀到了需要加載的新的頁(yè)面,在即將替換掉當(dāng)前頁(yè)面時(shí)調(diào)用。Onunload是無法阻止頁(yè)面的更新和關(guān)閉的。而 Onbeforeunload 可以做到。
頁(yè)面加載時(shí)只執(zhí)行onload
頁(yè)面關(guān)閉時(shí)先執(zhí)行onbeforeunload,最后onunload
頁(yè)面刷新時(shí)先執(zhí)行onbeforeunload,然后onunload,最后onload。
相關(guān)文章
javascript input圖片上傳及預(yù)覽,FileReader預(yù)覽圖片
本文放置了html完成代碼案例,有需要大家可以直接復(fù)制測(cè)試功能,采用input文本框圖片上傳,使用FileReader預(yù)覽圖片效果2021-06-06javascript 學(xué)習(xí)筆記(四) 倒計(jì)時(shí)程序代碼
javascript 學(xué)習(xí)筆記(四) 倒計(jì)時(shí)程序代碼,需要的朋友可以參考下。2011-04-04JavaScript正則表達(dá)式之multiline屬性的應(yīng)用
這篇文章主要介紹了JavaScript正則表達(dá)式之multiline屬性的應(yīng)用,是JS學(xué)習(xí)進(jìn)階中的重要知識(shí),需要的朋友可以參考下2015-06-06javascript彈出窗口 window.open使用方法以及參數(shù)說明分析篇
window.open是網(wǎng)頁(yè)中經(jīng)常遇到的彈出窗口代碼,不是網(wǎng)絡(luò)中比較反感的那類彈出代碼。用于新頁(yè)面?zhèn)髦?,回傳等?/div> 2009-12-12JavaScript學(xué)習(xí)筆記之JS函數(shù)
這篇文章主要簡(jiǎn)單介紹下javascript中函數(shù)的概念以及函數(shù)的參數(shù)、返回值、局部變量、全局變量以及示例分享,是篇非常不錯(cuò)的文章,推薦給大家學(xué)習(xí)下。2015-01-01js實(shí)現(xiàn)各瀏覽器全屏代碼實(shí)例
本篇文章給大家分享了js實(shí)現(xiàn)各瀏覽器全屏的詳細(xì)代碼,有興趣的朋友可以參考學(xué)習(xí)下。2018-07-07JavaScript原生對(duì)象之Date對(duì)象的屬性和方法詳解
這篇文章主要介紹了JavaScript原生對(duì)象之Date對(duì)象的屬性和方法詳解,需要的朋友可以參考下2015-03-03最新評(píng)論