获取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) {并把 tr = tr.nextSibling; 改成 tr = nextElementSibling(tr); 就可以了
do { el = el.nextSibling } while (el && el.nodeType !== 1);
return el;
}
当然可以可以尝试加强if判断
if (tr && tr.nodeType == 1 && (nodeC.length > 0)) {...}