欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探索瀏覽器頁(yè)面關(guān)閉window.close()的使用詳解

 更新時(shí)間:2020年08月21日 14:17:26   作者:行舟客  
這篇文章主要介紹了探索瀏覽器頁(yè)面關(guān)閉window.close()的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

說(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)文章

最新評(píng)論