// 切换节点状态(只处理节点的展开/关闭状态)
// 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");
}
}以上是在调用改变树节点状态为收起时报的!!十分不解这是为什么......希望得到一些指导。。树节点
// 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");
}
}以上是在调用改变树节点状态为收起时报的!!十分不解这是为什么......希望得到一些指导。。树节点
解决方案 »
- **急!图片以二进制流存入数据库问题,image类型如何存入图片?
- 引用后为什么还是找不到类型和空间??
- 下了个换肤软件SkinPP3.0,也能用,就是不知道如何动态换肤?
- 关于Database db = DatabaseFactory.CreateDatabase()
- 怎样将一个字符串转换为运算符?
- c# winform 防止多重启动,在同一路径下不能多重启动,在不同路径下可以重复启动
- 关于消息队列的问题
- 请教一个数据库连接类的调用方法
- 菜鸟,我是!但是对这个职业很感兴趣,我给100,渴望成熟~~~谢谢!
- 静态成员是不是只能通过CLASS来访问??
- 求教关于datagridview回车换行的问题,我重载了ProcessDialogKey()函数但是不管用
- 使用XPath查询XML文件时,多了xmlns属性后就查不到节点,这是怎么回事?
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)) {...}
<html>
<head>
<script type="text/javascript">
function test() {
var tr1 = document.getElementById("tr1");
var tr = tr1.nextSibling;
alert(tr.nodeName); // IE: TR, Fiefox:#text, Chrome: #text
tr = nextElementSibling(tr1)
alert(tr.nodeName); // IE: TR, Fiefox:TR, Chrome: TR
} function nextElementSibling(el) {
do { el = el.nextSibling } while (el && el.nodeType !== 1);
return el;
}
</script></head>
<body>
<div>
<table border="0" cellspacing="0" cellpadding="0">
<tr id="tr1">
<td>
td 1
</td>
</tr>
<tr id="tr2">
<td>
td 2
</td>
</tr>
<tr>
<td>
<input type="button" value="Test" onclick="test();" />
</td>
</tr>
</table>
</div>
</body>
</html>