MOSS结合 BI的还没处理完,先发个遍历treeview的js代码上来。不是普通的那种哦。先介绍背景。
项目由于要涉及多选,大部分位code开发,所以我使用了TreeView ,成树倒是简单了。可以遍历成了问题。
直接执行服务器端时间倒是可以解决,但是刷新成了最主要的问题。还有父子之间的联动问题。
下面提供的是遍历和父子之间,父节点选中所有子节点全选全不选的联动。
代码如下供参考:
function findAllCheckedLeaf(topdiv)//传入树的clientId, 返回所有checked叶子节点的text值
{
var reValue = '';
if(topdiv != null)
{
var isLeaf = true;
for(var i=0; i<topdiv.childNodes.length; i++)
{
var tChild = topdiv.childNodes[i];
if(tChild.tagName == 'DIV')
{
isLeaf = false;
}
}
if(!isLeaf)
{
for(var j=0; j<topdiv.childNodes.length; j++)
{
var fChild = topdiv.childNodes[j];
if(fChild.tagName == 'DIV')
{
reValue += findAllCheckedLeaf(fChild);
}
}
}
else
{
for(var k=0; k<topdiv.childNodes.length; k++)
{
var fChild = topdiv.childNodes[k];
var checkboxIndex = fChild.rows[0].cells.length - 1;
var cell = fChild.rows[0].cells[checkboxIndex];
var checkboxes = cell.getElementsByTagName('INPUT');
if (checkboxes.length == 1)
{
if(checkboxes[0].checked)
reValue += fChild.innerText+';';
}
}
}
}
return reValue;
}
//父子联动 关联到树的onclick事件上。
function setNodeCheckBox()
{
var element = window.event.srcElement;
if (element.tagName == 'INPUT' && element.type == 'checkbox')
{
var checkedState = element.checked;
while (element.tagName != 'TABLE')
element = element.parentElement;
var nextElement = element.nextSibling;
setChildCheckbox(nextElement,checkedState);
}
}
function setChildCheckbox(nextElement,checkedState)
{
if(nextElement != null)
{
for(var i=0;i<nextElement.childNodes.length;i++)
{
var element = nextElement.childNodes[i];
if(element.tagName == 'DIV')
{
if(element.childNodes.length != 0)
setChildCheckbox(element,checkedState);
}
if(element.tagName == 'TABLE')
{
var checkboxIndex = element.rows[0].cells.length - 1;
var cell = element.rows[0].cells[checkboxIndex];
var checkboxes = cell.getElementsByTagName('INPUT');
if (checkboxes.length == 1)
checkboxes[0].checked = checkedState;
}
}
}
}
搞定。浪费了我一下午的脑细胞。上往搜了多少个都是直接吧treeview什么的直接弄上去的。
针对不同的情况可能会有所调整,不过耐心点,找结构的层次关系。就会实现你想要的任何效果。
简直是造福民众啊。。。(写JS it's so tired that i want to death!!)