首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

获取tr.style.Display时报对象为空或未定义的异常.

2013-09-06 
获取tr.style.Display时报对象为空或未定义的错误...// 切换节点状态(只处理节点的展开/关闭状态)// toggl

获取tr.style.Display时报对象为空或未定义的错误...
获取tr.style.Display时报对象为空或未定义的异常.

// 切换节点状态(只处理节点的展开/关闭状态)
// toggleBy -- 引发Toggle事件的控件
function TreeGrid_ToggleNodeExpandState(toggleTd, toggleTr, nodeR)
{
    var td;
    var tr;
    td = toggleTd;
    tr = toggleTr;
    
    var nodeC = TreeGrid_GetNodeChildrenRelation(nodeR, true);  // 获得节点所有的子孙节点(不包括自己)(深度遍历)
    if (!nodeC) {return;}

    var expand = (nodeR.e == "e") ? false : true;               // 根据节点的状态,判断进行展开还是关闭
    nodeR.e = (nodeR.e == "e") ? "c" : "e";                     // 切换节点的状态
    tr = tr.nextSibling;                                        // 
    var nodeChildrenCount = 0;                                  // 直接子节点数
    
    if (tr && (nodeC.length > 0)) {
        var directChildExpanded = false;
        for (var cIndex = 0; cIndex < nodeC.length; cIndex++) { // 循环--巧妙的循环(各行tr是深度遍历的结果,nodeC也是深度遍历的结果)
            if (!expand) {
                tr.style.display="none";//这里是报错代码                                                 // 切换为关闭状态 -- 设置节点的直接子节点pe = "c".
                //tr.style.display = "none";
                // 只处理直接子节点


                if (nodeChildrenCount == 0) {                   // 第一次时为true,以后每次获得的都是直接子节点的子孙节点的个数。
                    nodeChildrenCount = TreeGrid_GetNodeChildrenCount(nodeC[cIndex]);        // 获得所有子孙节点的个数(不包括自己)
                    //alert(nodeChildrenCount);
                    nodeC[cIndex].pe = "c";
                    //alert("ok" + nodeC[cIndex].pe + nodeC[cIndex].i);
                }
                else {
                    nodeChildrenCount--;                        // -- 处理下个节点。连续跳过,直到遇到下一个直接子节点
                }
            }
            else {                                              // 切换为展开状态 -- 一个子孙节点是否展开,取决于其父节点是否展开(更准确应为祖先节点)(是否有规则保证仅检验父呢?)
                if (nodeChildrenCount == 0) {                   // 直接子节点一定展开
                    nodeChildrenCount = TreeGrid_GetNodeChildrenCount(nodeC[cIndex]);    //alert(nodeChildrenCount);
                    nodeC[cIndex].pe = "e";
                    tr.style.display = "block";


                    
                    // 如果直接子节点是关闭的,那么这个直接子节点的所有子孙,无论父节点是否展开,都不应展开。
                    directChildExpanded = (nodeC[cIndex].e == "e") ? true : false;   // 直接子节点的状态
                }
                else {
                    nodeChildrenCount--;
                    if (directChildExpanded && nodeC[cIndex].pe == "e") {    // 直接子节点是展开的 且 父节点是展开的
                        tr.styledisplay = "block";
                        //tr.style.display = "block";
                    }
                }
            }
            
            if (cIndex < nodeC.length-1) {
                tr = tr.nextSibling;                            // 下一行
            }
        }
        //var checkbox = tr.getElementsByTagName("INPUT");
    }
}

以上是在调用改变树节点状态为收起时报的!!十分不解这是为什么......希望得到一些指导。。 树节点


[解决办法]
tr.style="display:'none'";
[解决办法]
tr.style.display="none" 的写法没有任何问题。

问题在于浏览器对于页面的解释不一样,因此tr.nextSibling取出来的内容就不一样。 FF和Chrome会在tr后面自动加一个nodeType是text的节点,该节点不是html元素(nodeType为element),不为空,因此可以通过if判断,但是没有style这个属性,用style.display自然报错。

该法也很简单,自己写个方法取下一个tr

function nextElementSibling(el) {
            do { el = el.nextSibling } while (el && el.nodeType !== 1);
            return el;
        }
并把 tr = tr.nextSibling;      改成 tr = nextElementSibling(tr); 就可以了

当然可以可以尝试加强if判断
if (tr && tr.nodeType == 1 && (nodeC.length > 0)) {...}

热点排行