1. 程式人生 > >javascript隱藏導航選單欄和關閉頁面

javascript隱藏導航選單欄和關閉頁面

最近遇到一個bug,該bug的根源是一個挺奇怪的需求,問題很簡單,是這樣的:從一個頁面登陸,登陸後進入到一個系統(嵌入到網頁的applet),但是要求登陸後的頁面要隱藏工具欄、導航欄。

咋一看很簡單,但做的時候發現不對勁。瀏覽器頁面的控制一般是用 javascript 中的內建物件window物件。下面是我的步驟:

1.如何隱藏導航欄、工具欄

開始想著在javrscript中將 windows.menubar=false 實在天真,window物件中,menubar、 locationbar、toobar等均是隻讀屬性。想要設定這些屬性,window物件只提供了一個介面:

window.open(URL,name,features,replace)
引數說明:

可以在features引數中設定以下表格的屬性,只需把想要隱藏的屬性設定為false或0 。(注:有些瀏覽器為了防止非法網站欺詐使用者,是不允許隱藏掉位址列的,在較新版本的chrome中,位址列我隱藏不掉撒~)

channelmode=yes|no|1|0 是否使用劇院模式顯示視窗。預設為 no。
directories=yes|no|1|0 是否新增目錄按鈕。預設為 yes。
fullscreen=yes|no|1|0 是否使用全屏模式顯示瀏覽器。預設是 no。處於全屏模式的視窗必須同時處於劇院模式。
height=pixels 視窗文件顯示區的高度。以畫素計。
left=pixels 視窗的 x 座標。以畫素計。
location=yes|no|1|0 是否顯示地址欄位。預設是 yes。
menubar=yes|no|1|0 是否顯示選單欄。預設是 yes。
resizable=yes|no|1|0 視窗是否可調節尺寸。預設是 yes。
scrollbars=yes|no|1|0 是否顯示滾動條。預設是 yes。
status=yes|no|1|0 是否新增狀態列。預設是 yes。
titlebar=yes|no|1|0 是否顯示標題欄。預設是 yes。
toolbar=yes|no|1|0 是否顯示瀏覽器的工具欄。預設是 yes。
top=pixels 視窗的 y 座標。
width=pixels 視窗的文件顯示區的寬度。以畫素計。
(表格圖片摘自W3School)
但是open函式開啟一個新的頁面不滿足我的需求,且劃紅線部分說明用 _parent、_self 等 指定自身頁面的值付給name引數,features是不生效的。瀏覽器這麼做應該是處於安全性的考慮,但對於我的這種特殊需求略顯尷尬。無奈之下就用這種open的辦法,在登入時彈出一個新的頁面,但這就需要將之前的登入頁面關閉(讓使用者多次登陸會瘋掉的),這也是我們目前使用的辦法。

2.js關閉頁面

這個更簡單,同樣是windows物件,window.close()方法無疑。 這裡查了好多好多資料後知道,主流瀏覽器為了使用者的安全考慮,原則上只允許指令碼關閉用window.open()方法開啟的頁面,比如說,使用者在瀏覽器中點開一個tab,然後輸入地址,回車,這樣得到的頁面是不允許直接用指令碼關掉的。我們在網上看到的類似以下方法(其中self可以替換成window,是等價的):

self.opener=null;  
self.open('', '_self');  
self.close();  

(注:FireFox瀏覽器需要在設定中開啟允許指令碼關閉瀏覽器的選項)

這些方法是利用瀏覽器的漏洞進行強行關閉的方法,即:將我們的頁面偽裝成用open()指令碼開啟的頁面。上面的方法在IE11 和 Chrome36的較新版本 中是行不通的,後來我們用了
open(location,'_self').close();
這種一看就是利用別人bug的方法,但效果不錯哦,還屢試不爽,直到Chrome37的出現打了我的臉……

Chrome37中,上述程式碼會使頁面無限跳轉…是因為谷歌已經修復了這個bug。Chrome做得好,怪只怪我們的設計是有問題的…目前我逛遍了能找得到的論壇,還沒找到新的方法。即便能找到,不排除chrome再次將新漏洞修復的可能,且隨著更新IE,firefox也將漏洞補上也是早晚的事。

所以說,開發的時候看看標準文件就好了,不要想太多,跟著規範走,然後規範自己的設計。至於我們bug,我現在可能還在考慮用別的辦法折中……