1. 程式人生 > >JS防止頁面被嵌入框架

JS防止頁面被嵌入框架

先看下面關於瀏覽器window物件的解釋

http://www.w3school.com.cn/jsref/dom_obj_window.asp

Window 物件表示瀏覽器中開啟的視窗。

如果文件包含框架(frame 或 iframe 標籤),瀏覽器會為 HTML 文件建立一個 window 物件,併為每個框架建立一個額外的 window 物件。

註釋:沒有應用於 window 物件的公開標準,不過所有瀏覽器都支援該物件。


下面是幾個常見的windwo物件屬性:

1.top
該變更永遠指分割視窗最高層次的瀏覽器視窗。如果計劃從分割視窗的最高層次開始執行命令,就可以用top變數。 


2.opener
opener用於在window.open的頁面引用執行該window.open方法的的頁面的物件。例如:A頁面通過window.open()方
法彈出了B頁面,在B頁面中就可以通過opener來引用A頁面,這樣就可以通過這個物件來對A頁面進行操作。 


3.parent
parent用於在iframe,frame中生成的子頁面中訪問父頁面的物件。例如:A頁面中有一個iframe或frame,那麼iframe
或frame中的頁面就可以通過parent物件來引用A頁面中的物件。這樣就可以獲取或返回值到A頁面中。


4.self

另外self 指的是當前視窗

注意parent與opener的區別:

parent指父視窗,在FRAMESET中,FRAME的PARENT就是FRAMESET視窗。 
opener指用WINDOW.OPEN等方式建立的新視窗對應的原視窗。 
parent是相對於框架來說父視窗物件 
opener是針對於用window.open開啟的視窗來說的父視窗,前提是window.open開啟的才有

document.parentWindow.menthod()呼叫父頁面的方法

附:Window物件、Parent物件、Frame物件、Document物件和Form物件的階層關係 
Window物件→Parent物件→Frame物件→Document物件→Form物件,
如下: parent.frame1.document.forms[0].elements[0].value;

接下來看看關於防止登陸頁面被嵌入到frame中的js指令碼(實際專案程式碼),原來的業務系統是被嵌入到一個frameset的frame中,因此當session過期問題,很可能就退出回到登陸頁面,此時發現登陸頁面嵌入到原來的frame中去了,解決辦法如下:

<script type="text/javascript">
	$(document).ready(function(){
		//讓login.jsp頁面始終在最上層,不嵌入到別的frame中
		if(parent.document != this){
			top.location.href="<%=request.getContextPath()%>/login.jsp";
		}};
</script>

這樣在頁面載入的時候就會先判斷當前父視窗物件的document物件是不是等於當前文件document物件,如果不是,則將top物件鏈向登陸頁面。

另一種方式可以的,只要判斷出當前的頂層top物件不是當前的window物件即可

<script type="text/javascript">
	if (window!=top){ // 判斷當前的window物件是否是top物件
		top.location.href =window.location.href; // 如果不是,將top物件的網址自動導向被嵌入網頁的網址
	}
</script>


參考部落格:

http://www.ruanyifeng.com/blog/2008/10/anti-frameset_javascript_codes.html

http://www.ruanyifeng.com/blog/2010/08/anti-frameset_javascript_codes_continued.html