https页面中出现莫名其妙的安全警告

    在IE中访问一个https的页面,这是一个相对比较安全的操作,所以IE会要求这个页面内的所有内容皆来自于安全的域。这时候要是页面中有http的资源,比如图片、脚本、页面(frame或iframe中)等,在IE的默认设置下我们就会得到一个内容安全的警告窗口。而今天遇到的这个警告可以说是莫名其妙到无语。

    原来在IE6下我就做过对https页面的友好支持,IE6似乎比IE7的要求还严格,iframe的src指向about:blank都算是不安全,会弹出下面这个安全警告窗口(IE7中指向这个空白页已经不算不安全了)。

    SecurityInformation.png
    // 这个窗口看得我都要吐了,今天

    经过一天的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]);
    
var treeview = this.GetTreeView(node);
    treeview.CheckedNodes 
= this.GetAllCheckedNodes(treeview);
    treeview.SelectedNodes 
= this.GetAllSelectedNodes(treeview);
}
    // 只是要用substring方法"手工"移掉作为container的span元素。

    下午正被这个问题搞得一筹莫展的时候,同事还又发现了IE一个同样让人抓狂的限制:
    · JScript中的eval无法处理超过65535元素的Array

posted on 2007-08-09 20:05  birdshome  阅读(7023)  评论(6编辑  收藏  举报

导航