探索瀏覽器頁(yè)面關(guān)閉window.close()的使用詳解
說(shuō)起來(lái)window.close(),這也是個(gè)“不太讓人省心”的角色。因?yàn)闉g覽器兼容性千差萬(wàn)別,還對(duì)他有諸多限制。
使用語(yǔ)法:
window.close()
場(chǎng)景復(fù)現(xiàn)
昨天發(fā)現(xiàn)有人在csdn上傳違禁文件,舉報(bào)后來(lái)到了這個(gè)頁(yè)面:
里面那個(gè)按鈕發(fā)現(xiàn)點(diǎn)擊無(wú)效!
就。。。當(dāng)時(shí)就挺尷尬的。
不過(guò)既然它說(shuō)是【關(guān)閉】,當(dāng)時(shí)就想到了這個(gè)堪稱“漏洞百出”的close事件,F(xiàn)12打開(kāi)控制臺(tái)一看:果不其然
看到這頓時(shí)就來(lái)了興趣
探索過(guò)程和解決方案
為什么就突然來(lái)了興趣呢?
首先,從這行代碼中可以看出:這個(gè)頁(yè)面不是通過(guò) window.open()
“打開(kāi)”的 —— MDN文檔中有說(shuō)明:不是通過(guò)window.open()方法打開(kāi)的窗口不能(直接)使用close進(jìn)行關(guān)閉 (以前這條是針對(duì)Firefox的策略)
顯然,csdn這位工程師也看過(guò)文檔,所以想用【在本頁(yè)面打開(kāi)空白頁(yè),然后再?gòu)?qiáng)行關(guān)閉】的“取巧”方法。但我不知道當(dāng)時(shí)是怎么測(cè)試的,還是說(shuō)后來(lái)瀏覽器又加的限制,這行代碼在本文所寫(xiě)時(shí)顯然在所有瀏覽器上都不能執(zhí)行!
現(xiàn)在讓我通過(guò)語(yǔ)法解釋一下上面的代碼:
//摘自:MDN var window = window.open(url,windowName,[windowFeatures]);
方法明確指出三個(gè)參數(shù),第三個(gè)參數(shù)一般用于在“彈出框頁(yè)面”處理長(zhǎng)寬限制,和我們當(dāng)前的問(wèn)題沒(méi)有關(guān)系,我們就不再考慮。
MDN對(duì)url參數(shù)進(jìn)行了說(shuō)明,這個(gè)參數(shù)可以是個(gè)路徑,可以是個(gè)頁(yè)面/圖片/其他瀏覽器支持類型的資源的地址, 如果參數(shù)1你寫(xiě)空串,會(huì)在指定的上下文環(huán)境中創(chuàng)建一個(gè)空頁(yè)面
我們看第二個(gè)參數(shù)windowName, 這個(gè)參數(shù)表示 你要指定資源在哪個(gè)窗口打開(kāi) ,如果你指定的窗口不存在,瀏覽器會(huì)創(chuàng)建一個(gè)新的窗口,并把這個(gè)窗口的window對(duì)象命名為windowName(可以通過(guò)window.name
獲取到),值得注意的是,這并不是這個(gè)窗口的【title】,當(dāng)你在別處使用<a>
或<form>
標(biāo)簽時(shí) 可以將target
屬性的值寫(xiě)成 windowName 進(jìn)行跳轉(zhuǎn),訪問(wèn),為空時(shí),一樣創(chuàng)建新窗口。
通過(guò)此處的描述我們可以知道, windowName的值應(yīng)該與target的值是相同的。
既然說(shuō)到了target,正好上面csdn用的也是a標(biāo)簽,那我們就以a鏈接為例 (另一方面form不常用),為<a></a>
添加 target 表示我要設(shè)置鏈接的打開(kāi)方式
1._self —— 默認(rèn)值,表示在當(dāng)前上下文中打開(kāi),不需要寫(xiě)
2._blank表示我要新創(chuàng)建一個(gè)tab/window
3._parent 表示在其上級(jí)上下文環(huán)境中加載,沒(méi)有上級(jí)時(shí)同_self
4._top表示在其頂級(jí)上下文環(huán)境中加載,沒(méi)有時(shí)同_self
所以現(xiàn)在常用的寫(xiě)法就是:
- 首先調(diào)用
window.open('', ‘_self')
方法 ,參數(shù)1置空 參數(shù)2寫(xiě)為_(kāi)self 表示我們要在當(dāng)前頁(yè)面加載一個(gè)空; - 此時(shí)仿佛就是一個(gè)偷梁換柱的作用,通過(guò)加載進(jìn)來(lái)一個(gè)空,將我們當(dāng)前訪問(wèn)的頁(yè)面變成
window.open()
打開(kāi)的頁(yè)面
這個(gè)時(shí)候 是不是就可以愉快地使用window.close()
方法并成功關(guān)閉當(dāng)前頁(yè)面了?
可以!
筆者可以確切的告訴你,這種方法在本地測(cè)試絕大多數(shù)瀏覽器上都可以正常使用!
但偏偏在這里(本文開(kāi)頭所說(shuō)實(shí)例)不行!
還有一點(diǎn)是:如果你在a標(biāo)簽的 href 中用了javascript:xxx;寫(xiě)事件,那就千萬(wàn)記得不能再加屬性target!
就在我焦頭爛額自我懷疑時(shí),一師兄給我說(shuō)了一個(gè)取巧的解決方案:about:blank
也可以!但似乎這并不是最好的方法?。?!
再回到上面的代碼,我想了許久,莫不是 瀏覽器兼容性 的問(wèn)題?
為此,我判斷了IE、Firefox、和其余瀏覽器(因?yàn)閾?jù)說(shuō)Firefox仍然在這個(gè)問(wèn)題上表現(xiàn)地尤為激烈):
// 兼容所有瀏覽器關(guān)閉頁(yè)面方法 function ClosePage(){ if (navigator.userAgent.indexOf("MSIE") > 0){ if (navigator.userAgent.indexOf("MSIE 6.0") > 0){ window.opener = null; window.close(); } else { window.open('', '_top'); window.top.close(); } } else if (navigator.userAgent.indexOf("Firefox") > 0) { window.location.href = 'about:blank'; } else { window.opener = null; window.open('', '_self', ''); window.close(); } }
用這個(gè)方法,在各個(gè)瀏覽器上找網(wǎng)頁(yè)試了一下,效果還不錯(cuò)。
但…
很多瀏覽器上會(huì)有和上面about:blank一樣的效果。
到這里我就納悶了,到底是為什么?
可能是瀏覽器對(duì)close的實(shí)現(xiàn)策略導(dǎo)致的。不過(guò)還沒(méi)等我納悶完,另一個(gè)消息就來(lái)了:這段代碼放到文首的那個(gè)頁(yè)面依然不行。。。(更新:在google和Firefox的一些網(wǎng)站如腳本之家也不能用?。?/p>
有點(diǎn)小懵,什么鬼?
csdn這里究竟用了什么導(dǎo)致“close事件不能執(zhí)行”?
一些小建議和結(jié)尾
這一點(diǎn)我不得而知。我后來(lái)分析了整個(gè)頁(yè)面,做了代碼復(fù)現(xiàn),斷點(diǎn)調(diào)試。。。依然沒(méi)能發(fā)現(xiàn)問(wèn)題出在哪里。
不過(guò)我從一開(kāi)始就覺(jué)得:這種方式——不論是“關(guān)閉頁(yè)面”還是“打開(kāi)一個(gè)空頁(yè)面提示”,它的效果似乎都還不如“返回瀏覽器首頁(yè)”好:
let historyLen = window.history.length; window.history.go(-historyLen+1)
更新:
這里其實(shí)是有問(wèn)題的,因?yàn)橛脩羧绻爸鲃?dòng)”觸發(fā)瀏覽器上面的“返回上一頁(yè)”的按鈕,那么window.history的length值并不會(huì)改變,當(dāng)你再執(zhí)行window.history.go()
的時(shí)候就不會(huì)有響應(yīng)了?。ǖ窃诒疚膱?chǎng)景下如果用戶返回了上一頁(yè)就不會(huì)有這個(gè)按鈕了,此問(wèn)題也就不存在)
筆者還想到了document.referrer
,它是用于獲取+改變“從哪里跳轉(zhuǎn)過(guò)來(lái)的”路徑的API,但是很不幸,我發(fā)現(xiàn)了一個(gè)很神奇的事情:document.referrer=""
時(shí),相當(dāng)于“本頁(yè)面” —— 也就是說(shuō),它會(huì)把上一個(gè)頁(yè)面也變?yōu)楫?dāng)前頁(yè)面!
這確實(shí)是很神奇的:因?yàn)間o函數(shù)也實(shí)現(xiàn)了這個(gè)功能——相當(dāng)于刷新當(dāng)前頁(yè)。
或者“返回網(wǎng)站首頁(yè)”?
location.href="xxx" rel="external nofollow"
這樣還能再宣傳一波,何樂(lè)而不為?
到此這篇關(guān)于探索瀏覽器頁(yè)面關(guān)閉window.close()的使用詳解的文章就介紹到這了,更多相關(guān)瀏覽器頁(yè)面關(guān)閉window.close()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript 限制輸入和粘貼(IE和火狐3.x下測(cè)試通過(guò))
限制輸入和粘貼的js代碼2008-11-11用Javascript輕松制作一套簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)
用Javascript輕松制作一套簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)...2006-12-12淺談使用splice函數(shù)對(duì)數(shù)組中的元素進(jìn)行刪除時(shí)的注意事項(xiàng)
下面小編就為大家?guī)?lái)一篇淺談使用splice函數(shù)對(duì)數(shù)組中的元素進(jìn)行刪除時(shí)的注意事項(xiàng)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12JavaScript實(shí)現(xiàn)經(jīng)緯度轉(zhuǎn)換常用方法總結(jié)
WGS84坐標(biāo)系、GCJ02坐標(biāo)系、BD09坐標(biāo)系和Web 墨卡托投影坐標(biāo)系是我們常見(jiàn)的四個(gè)坐標(biāo)系。這篇文章為大家整理了這四個(gè)坐標(biāo)系之間相互轉(zhuǎn)換的方法,需要的可以參考一下2023-02-02解決layui數(shù)據(jù)表格Date日期格式的回顯Object的問(wèn)題
今天小編就為大家分享一篇解決layui數(shù)據(jù)表格Date日期格式的回顯Object的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09js實(shí)現(xiàn)使用輸入input和改變change事件模擬手動(dòng)輸入
聚焦于JavaScript中的輸入模擬技術(shù),本指南將帶你探索如何使用input和change事件來(lái)創(chuàng)造逼真的手動(dòng)輸入效果,通過(guò)簡(jiǎn)單的代碼實(shí)現(xiàn),你將掌握這一實(shí)用的技巧,為你的Web應(yīng)用增添交互的樂(lè)趣,需要的朋友可以參考下2024-03-03Javascript中Cookie的獲取和保存應(yīng)用案例
這篇文章主要給大家介紹了關(guān)于Javascript中Cookie的獲取和保存應(yīng)用的相關(guān)資料,Cookie是直接存儲(chǔ)在瀏覽器中的一小串?dāng)?shù)據(jù),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09JavaScript實(shí)現(xiàn)的浮動(dòng)層框架用法實(shí)例分析
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的浮動(dòng)層框架用法,以實(shí)例形式分析了JavaScript實(shí)現(xiàn)可關(guān)閉的半透明浮動(dòng)層相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10