網頁

2006年11月17日 星期五

Iframe自動調整高度, 在子網域SubDomain的情形

全部參考:
1.Iframe自動調整高度, 在子網域SubDomain的情形
2.處理iframe auto height(Iframe自適應高度)
3.處理iframe auto height(Iframe自適應高度) - 相關問題紀錄
4.完整的iframe auto height程式(在iframe內容頁中處理)
5.或許你想要 "html include html,兩種工具介紹。"


如果CompanyName.com要以Iframe放入srv.CompanyName.com的網頁, 這時會有cross-site的問題, 無法互相以javascript設定Iframe的高度, 因此想到要以cookie的傳遞來完成這件工作.

當然子網域是可以用簡單的方式,就是設定document.domain,例如sub.a.com和www.a.com都加上document.domain = "a.com",但這樣會延伸出安全性的問題,
1. 因為不只iframe height,其它的網頁元素或資訊,如cookie也全都可以取得。
2. 其它如other.a.com,本來希望是cross-site,但它也可以跟著設定domain。
3. 可能會提供customer.a.com給你的客戶。

所謂cross-site,不同host就是cross-site
of.openfoundry.org 和 rt.of.openfoundry.org互相是cross-site, 沒有主從關係
of.openfoundry.org 和 of.openfoundry.org/rt, path間的關係不是cross-site

適用於IE;Firefox;Opera

過程大致如下:
1.在Iframe內容頁面(srv.CompanyName.com)的onload時, 取得頁面高度, 並放在主要Domain Cookie(CompanyName.com)中.
2.在CompanyName.com的網頁中, 再於Iframe的onload時, 取得Cookie的的值, 再去設定Iframe的高度.


過程1:

function iframeAutoFit()
{
var now = new Date();
setCookie("IframeMaxHeight", this.document.body.scrollHeight,
now,"/","CompanyName.com");
}

if(window.attachEvent)
{
window.attachEvent("onload", iframeAutoFit);
}
else if(window.addEventListener)
{
window.addEventListener('load', iframeAutoFit, false);
}

function setCookie(name, value, expires, path, domain, secure) {
var curCookie = name + "=" + escape(value) +
((expires) ? "; expires=" + expires.toGMTString() : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
document.cookie = curCookie;
}





過程2:

<iframe id="wiki" src="Content.html" frameborder="NO" scrolling="auto"
style="width:100%; height:2000px" onload="DoIframeToMaxHeight();">
</iframe>


function DoIframeToMaxHeight(){
//某些Browser的Iframe onload事件似乎慢了一點, 或setCookie時慢了一點, 所以要等一下子
window.setTimeout('IframeToMaxHeight("wiki")',500);
}

function IframeToMaxHeight(id){
try{
document.getElementById(id).style.height =
parseInt(getCookie("IframeMaxHeight")) + 50;
}
catch (ex){}
}

function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
} else
begin += 2;
var end = document.cookie.indexOf(";", begin);
if (end == -1)
end = dc.length;
return unescape(dc.substring(begin + prefix.length, end));
}


一些情形:

1.Iframe 的onload事件:
在Linux的Konqueror中似乎只有第一次, 之後內容的改變都不會再onload.
Mac的Safari似乎沒有這個onload事件, 因此Iframe先預設高度為2000px.
而IE 6; Firefox 2; Opera 9都沒有問題.
2.在Konqueror3.5中Iframe會蓋住Div
3.觀看時調整字型變大時, 不會立即有反應, 而會出會Scroll Bar.

沒有留言: