在IE中通路一個https的頁面,這是一個相對比較安全的操作,是以IE會要求這個頁面内的所有内容皆來自于安全的域。這時候要是頁面中有http的資源,比如圖檔、腳本、頁面(frame或iframe中)等,在IE的預設設定下我們就會得到一個内容安全的警告視窗。而今天遇到的這個警告可以說是莫名其妙到無語。
原來在IE6下我就做過對https頁面的友好支援,IE6似乎比IE7的要求還嚴格,iframe的src指向about:blank都算是不安全,會彈出下面這個安全警告視窗(IE7中指向這個空白頁已經不算不安全了)。
// 這個視窗看得我都要吐了,今天
經過一天的debug,最後确定了出錯的代碼和出錯場景。代碼如下:

var span = node.document.createElement('SPAN');

span.innerHTML = data;

childTreeContent.innerHTML = String.Empty;

var tree = span.childNodes[0].childNodes[0];

if ( tree && tree.rows.length > 0 )
{
childTreeContent.appendChild(tree);
this.UpdateProfileIcon(tree.rows[0]);
var treeview = this.GetTreeView(node);
treeview.CheckedNodes = this.GetAllCheckedNodes(treeview);
treeview.SelectedNodes = this.GetAllSelectedNodes(treeview);
}
稍加解釋,這段代碼就是把從伺服器段動态取回來的TreeView的子節點添加到樹上去。由于子樹的html在傳回的時候有一個span作為其container,是以我就先把html轉成DOM對象,然後取span對象的子對象的子對象。代碼第一行的那個span是用來轉換html到DOM對象的,第四行就是取出樹(子樹)對象,然後判斷子樹是否有節點,如果有就用過childTreeContent.appendChild(tree)添加到TreeView上去。
結果問題就出在了這最後appendChild()一句上!更郁悶的這個警告視窗還不是執行這段代碼就必然出,它還有一個條件,隻有當data中的html代碼大于一定數量的時候,才會出這個提示。我反複測試,發現這個門檻值在15-20k的html代碼之間,具體的那個值到底是幾何,我實在是沒有興趣去測出來了。也就是說,當子樹的html代碼小于15k的時候,執行上面的代碼,不會有任何警告提示;而當傳回的html代碼大于20k的時候,就會出那個Security
Information的警告視窗@_@。真是要了親命的說~~~
解決這個問題的辦法似乎也很扯淡,直接對子樹節點的innerHTML指派就行了。。。

var treeData = data.substring(data.indexOf('>')+1, data.length-7);

childTreeContent.innerHTML = treeData;

var childTree = childTreeContent.children(0);

if ( childTree && childTree.rows.length > 0 )
this.UpdateProfileIcon(childTree.rows[0]);
// 隻是要用substring方法"手工"移掉作為container的span元素。
本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。