原来在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);
}
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]);
var treeview = this.GetTreeView(node);
treeview.CheckedNodes = this.GetAllCheckedNodes(treeview);
treeview.SelectedNodes = this.GetAllSelectedNodes(treeview);
}
// 只是要用substring方法"手工"移掉作为container的span元素。
childTreeContent.innerHTML = treeData;
var childTree = childTreeContent.children( 0 );
if ( childTree && childTree.rows.length > 0 )
{
this.UpdateProfileIcon(childTree.rows[0]);
var treeview = this.GetTreeView(node);
treeview.CheckedNodes = this.GetAllCheckedNodes(treeview);
treeview.SelectedNodes = this.GetAllSelectedNodes(treeview);
}
下午正被这个问题搞得一筹莫展的时候,同事还又发现了IE一个同样让人抓狂的限制:
· JScript中的eval无法处理超过65535元素的Array