iframe窗口高度自適應(yīng)的又一個(gè)巧妙實(shí)現(xiàn)思路
更新時(shí)間:2014年04月04日 11:44:20 作者:
這篇文章主要介紹了實(shí)現(xiàn)iframe窗口高度自適應(yīng)的又一個(gè)巧妙思路,需要的朋友可以參考下
domainA 中有一個(gè)頁面index.html,通過iframe嵌套了domainB中的一個(gè)頁面other.html
由于other.html頁面在iframe中顯示,而且其頁面內(nèi)容會動態(tài)的增加或減少,現(xiàn)在需要去掉iframe的滾動條
由于javascript同源策略的限制,無法進(jìn)行跨域操作,使得問題比較棘手
參考了一下網(wǎng)上的做法,引入了一個(gè)代理頁面,或者叫做中介 agent.html,屬于domainA
然后,在domainB 中的other.html中,再使用iframe將agent.html進(jìn)行嵌套
好了,現(xiàn)在情況是這樣的:
index.html 使用iframe 嵌套 other.html
other.html 使用iframe 嵌套 agent.html
之所以要引入第3個(gè)頁面agent.html,就是為了遵守“同源策略”的規(guī)則,完成不同domain下參數(shù)的傳遞!
我們最終的目的是要去掉滾動條,又要保證被嵌入的頁面內(nèi)容全部得到顯示
1.取得other.html頁面的實(shí)際高度height
2.將height設(shè)置到其嵌入的iframe的src屬性上
3.在agent.html中截取出所屬iframe的src屬性中的height值
下面的例子中,使用了一個(gè)技巧,避免了使用setInterval()不斷去設(shè)置iframe的高度
做法是在iframe的src上,附加一個(gè)時(shí)間戳,讓瀏覽器每次都重新加載agent.html
進(jìn)而讓agent.hml中的js函數(shù)invokeMethodInTopWindow()得到執(zhí)行
domainA 中的2個(gè)html
index.html
#{extends 'main.html' /}
#{set title:'Home' /}
<hr>
<div style="color:red;font-weight:bold">窗口自適應(yīng)---繞開同源策略的限制,同時(shí)又利用同源策略,去掉iframe的滾動條,動態(tài)調(diào)整窗口的高度,讓其能夠顯示被嵌套頁面的所有內(nèi)容</div>
<!-- 需要動態(tài)調(diào)整高度的iframe -->
<div style="text-align:center;">
<iframe name="domainB" src="http://127.0.0.1:8088/other" width="80%" scrolling="no" frameborder="0"></iframe>
</div>
<script type="text/javascript">
function resize(height) {
//alert("resize");
document.getElementsByName("domainB")[0].height=height;
}
</script>
agent.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是代理頁面哦!
<script type="text/javascript">
window.onload = invokeMethodInTopWindow;
function invokeMethodInTopWindow() {
//alert("調(diào)用同域下的函數(shù),重置iframe的高度");
var domainA = document.parentWindow;
var realHeight = domainA.location.hash.split("#")[1];
//last step:調(diào)用最上層窗口的函數(shù),重置iframe的高度
parent.parent.resize(realHeight);
//alert("realHeight:"+realHeight);
//alert(document.parentWindow.name);//獲取容器所在窗口的名稱 domainA
//error://alert(document.parentWindow.parent.name); //訪問失敗 :不能訪問domainB
//alert(document.parentWindow.parent.parent.name);//最頂層window屬于domainA,因此可以訪問
}
//使用不同的時(shí)間戳設(shè)置iframe的src屬性后,就不用使用setInterval()
//setInterval("invokeMethodInTopWindow()",100);
</script>
</body>
</html>
domainB中的other.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body onclick="proxy()">
<!-- 被A域所嵌入的頁面 -->
<button type="button" onclick="btnClick()">切換顯示</button>
<div style="display:none">
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
</div>
<div style="display:block">
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
</div>
<!-- 反向嵌入A域的頁面 -->
<iframe name="domainA" src="" style="display:none"></iframe>
<!-- script -->
<script type="text/javascript">
//隱藏或顯示div
function btnClick() {
var div = document.getElementsByTagName("div");
for(var i in div) {
if(i<div.length)
div[i].style.display = (div[i].style.display == 'none') ? "block" : "none";
}
}
</script>
<script type="text/javascript">
function proxy(){
//alert("btn click");
//獲取本頁面的高度
var scrollHeight = document.documentElement.scrollHeight;
//alert("滾動條高度:"+scrollHeight);
//將窗口的高度先設(shè)置到屬于domainA的iframe的src屬性上
var iframeDomainA = document.getElementsByName("domainA")[0];
//用domainA的一個(gè)頁面作為代理,最終的目的是解決“同源策略”的限制
var url = "http://localhost:9000/agent";
/**技巧:通過時(shí)間戳讓瀏覽器每次重新加載iframe,這樣每次都會自動設(shè)置被嵌套的iframe的高度,避免了使用setInterval()*/
iframeDomainA.src = url+ "? time=" + new Date().getTime() + "#" + scrollHeight ;
}
window.onload = proxy;
</script>
</body>
</html>
由于other.html頁面在iframe中顯示,而且其頁面內(nèi)容會動態(tài)的增加或減少,現(xiàn)在需要去掉iframe的滾動條
由于javascript同源策略的限制,無法進(jìn)行跨域操作,使得問題比較棘手
參考了一下網(wǎng)上的做法,引入了一個(gè)代理頁面,或者叫做中介 agent.html,屬于domainA
然后,在domainB 中的other.html中,再使用iframe將agent.html進(jìn)行嵌套
好了,現(xiàn)在情況是這樣的:
index.html 使用iframe 嵌套 other.html
other.html 使用iframe 嵌套 agent.html
之所以要引入第3個(gè)頁面agent.html,就是為了遵守“同源策略”的規(guī)則,完成不同domain下參數(shù)的傳遞!
我們最終的目的是要去掉滾動條,又要保證被嵌入的頁面內(nèi)容全部得到顯示
1.取得other.html頁面的實(shí)際高度height
2.將height設(shè)置到其嵌入的iframe的src屬性上
3.在agent.html中截取出所屬iframe的src屬性中的height值
下面的例子中,使用了一個(gè)技巧,避免了使用setInterval()不斷去設(shè)置iframe的高度
做法是在iframe的src上,附加一個(gè)時(shí)間戳,讓瀏覽器每次都重新加載agent.html
進(jìn)而讓agent.hml中的js函數(shù)invokeMethodInTopWindow()得到執(zhí)行
domainA 中的2個(gè)html
index.html
復(fù)制代碼 代碼如下:
#{extends 'main.html' /}
#{set title:'Home' /}
<hr>
<div style="color:red;font-weight:bold">窗口自適應(yīng)---繞開同源策略的限制,同時(shí)又利用同源策略,去掉iframe的滾動條,動態(tài)調(diào)整窗口的高度,讓其能夠顯示被嵌套頁面的所有內(nèi)容</div>
<!-- 需要動態(tài)調(diào)整高度的iframe -->
<div style="text-align:center;">
<iframe name="domainB" src="http://127.0.0.1:8088/other" width="80%" scrolling="no" frameborder="0"></iframe>
</div>
<script type="text/javascript">
function resize(height) {
//alert("resize");
document.getElementsByName("domainB")[0].height=height;
}
</script>
agent.html
復(fù)制代碼 代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是代理頁面哦!
<script type="text/javascript">
window.onload = invokeMethodInTopWindow;
function invokeMethodInTopWindow() {
//alert("調(diào)用同域下的函數(shù),重置iframe的高度");
var domainA = document.parentWindow;
var realHeight = domainA.location.hash.split("#")[1];
//last step:調(diào)用最上層窗口的函數(shù),重置iframe的高度
parent.parent.resize(realHeight);
//alert("realHeight:"+realHeight);
//alert(document.parentWindow.name);//獲取容器所在窗口的名稱 domainA
//error://alert(document.parentWindow.parent.name); //訪問失敗 :不能訪問domainB
//alert(document.parentWindow.parent.parent.name);//最頂層window屬于domainA,因此可以訪問
}
//使用不同的時(shí)間戳設(shè)置iframe的src屬性后,就不用使用setInterval()
//setInterval("invokeMethodInTopWindow()",100);
</script>
</body>
</html>
domainB中的other.html
復(fù)制代碼 代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body onclick="proxy()">
<!-- 被A域所嵌入的頁面 -->
<button type="button" onclick="btnClick()">切換顯示</button>
<div style="display:none">
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
在JavaScript中,有一個(gè)很重要的安全性限制,被稱為“Same-Origin Policy”(同源策略)。
這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔在同一域下的內(nèi)容。
所謂同源是指,域名,協(xié)議,端口相同。
</div>
<div style="display:block">
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
比如一個(gè)黑客程序,他利用IFrame把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名,密碼登錄時(shí),
他的頁面就可以通過Javascript讀取到你的表單中input中的內(nèi)容,這樣用戶名,密碼就輕松到手了。
</div>
<!-- 反向嵌入A域的頁面 -->
<iframe name="domainA" src="" style="display:none"></iframe>
<!-- script -->
<script type="text/javascript">
//隱藏或顯示div
function btnClick() {
var div = document.getElementsByTagName("div");
for(var i in div) {
if(i<div.length)
div[i].style.display = (div[i].style.display == 'none') ? "block" : "none";
}
}
</script>
<script type="text/javascript">
function proxy(){
//alert("btn click");
//獲取本頁面的高度
var scrollHeight = document.documentElement.scrollHeight;
//alert("滾動條高度:"+scrollHeight);
//將窗口的高度先設(shè)置到屬于domainA的iframe的src屬性上
var iframeDomainA = document.getElementsByName("domainA")[0];
//用domainA的一個(gè)頁面作為代理,最終的目的是解決“同源策略”的限制
var url = "http://localhost:9000/agent";
/**技巧:通過時(shí)間戳讓瀏覽器每次重新加載iframe,這樣每次都會自動設(shè)置被嵌套的iframe的高度,避免了使用setInterval()*/
iframeDomainA.src = url+ "? time=" + new Date().getTime() + "#" + scrollHeight ;
}
window.onload = proxy;
</script>
</body>
</html>
您可能感興趣的文章:
- javascript原生和jquery庫實(shí)現(xiàn)iframe自適應(yīng)高度和寬度
- 教你用jquery實(shí)現(xiàn)iframe自適應(yīng)高度
- jquery ajax應(yīng)用中iframe自適應(yīng)高度問題解決方法
- js控制iframe的高度/寬度讓其自適應(yīng)內(nèi)容
- 兼容主流瀏覽器的iframe自適應(yīng)高度js腳本
- iframe窗口高度自適應(yīng)的實(shí)現(xiàn)方法
- 如何設(shè)置iframe高度自適應(yīng)在跨域情況下的可用方法
- JavaScript設(shè)置IFrame高度自適應(yīng)(兼容各主流瀏覽器)
- JavaScript 處理Iframe自適應(yīng)高度(同或不同域名下)
- IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼
- jQuery解決iframe高度自適應(yīng)代碼
- Iframe實(shí)現(xiàn)跨瀏覽器自適應(yīng)高度解決方法
相關(guān)文章
淺析JavaScript中兩種類型的全局對象/函數(shù)
這篇文章主要介紹了JavaScript中兩種類型的全局對象/函數(shù)。需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12JavaScript版TAB選項(xiàng)卡效果實(shí)例
tab選項(xiàng)卡效果就是當(dāng)我指上或經(jīng)過時(shí)就會顯示這個(gè)選項(xiàng)卡下面的內(nèi)容,下面我來給大家介紹一款純js實(shí)現(xiàn)的TAB選項(xiàng)卡效果,有需要的朋友可以參考一下2013-08-08JS,Jquery獲取select,dropdownlist,checkbox下拉列表框的值(示例代碼)
本篇文章主要是對JS,Jquery獲取select,dropdownlist,checkbox下拉列表框的值(示例代碼)進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01javascript取消文本選定的實(shí)現(xiàn)代碼
最近在做拖動布局. 發(fā)現(xiàn)有文本選定的時(shí)候, 進(jìn)行拖動很不好看.2010-11-11js 實(shí)現(xiàn)在離開頁面時(shí)提醒未保存的信息(減少用戶重復(fù)操作)
在離開頁面時(shí)判斷是否有未保存的輸入值,然后進(jìn)行提醒,接下來介紹實(shí)現(xiàn)步驟,感興趣的朋友可以了解下2013-01-01微信小程序使用swiper組件實(shí)現(xiàn)層疊輪播圖
這篇文章主要為大家詳細(xì)介紹了微信小程序使用swiper組件實(shí)現(xiàn)層疊輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11