При выполнении разрешений в основном реализуются следующие функции:
1. Если узел доступен, его родительский узел также должен быть доступен;
2. Если узел доступен, то к его дочерним узлам также можно получить доступ;
3. Если узел недоступен, его дочерние узлы также недоступны.
Использование числовой структуры с CheckBox может обеспечить хороший пользовательский опыт, но при этом немного увеличивается сложность программирования. Если все это делает сервер, то если вы нажмете на него, это точно не сработает. , что расстраивает при отладке с помощью javascript. Very, класса слов, и разочаровывающей рекурсии. Раньше я использовал следующий метод.
<script Language="JavaScript">
<!--
//Инициализируем узел
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
//Инициализируем выбранный узел
функция initchecknode(дерево,tvvalue)
{
//Получаем строку узла, которому необходимо инициализировать состояние выбора.
вар selectedNodes = tvvalue;
вар arrayNodes = новый массив ();
arrayNodes = selectedNodes.split(",");
вар AllRootNode = новый массив ();
AllRootNode=document.getElementById(дерево).getChildren();
//Инициализируем выбранный узел
findAndCheckedNodes(AllRootNode,arrayNodes);
}
//Инициализируем выбранный узел на основе строки выбранного узла
функция findAndCheckedNodes(NodeArray,nodeDatas)
{
//оповещение(NodeArray.length);
если (parseInt(NodeArray.length) == 0)
{
возвращаться;
}
еще
{
for(var i=0;i<parseInt(NodeArray.length);i++)
{
вар cNode, nodeData;
cNode=NodeArray[i];
////Если узел находится в nodeDatas, инициализироватьchecked = true;
nodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.length;j++)
{
если (nodeDatas[j] == nodeData)
{
cNode.setAttribute("проверено","истина");
перерыв;
}
}
//Если есть дочерние узлы, продолжаем рекурсию
if(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
// событие проверки
функция Tree_oncheck (дерево)
{
вар я;
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("проверено");
setcheck (узел, Pchecked);
setParent (узел, Pchecked);
//window.alert(Pchecked);
document.all.checked.value = "";
если (tree.getChildren().length > 0)
{
для (i=0;i<=tree.getChildren().length-1;i++)
{
if (tree.getChildren()[i].getAttribute("Проверено"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(tree.getChildren()[i]);
}
}
}
//Устанавливаем
функцию выбора дочернего узла setcheck(node,Pchecked)
{
вар я;
вар ChildNode = новый массив ();
ChildNode=node.getChildren();
если (parseInt(ChildNode.length) == 0)
{
возвращаться;
}
еще
{
for(i=0;i<ChildNode.length;i++)
{
вар cNode;
cNode=ChildNode[i];
cNode.setAttribute("Проверено",Pпроверено);
//cNode.Checked = Pchecked;
if(parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//Устанавливаем выбор/отмену дочернего узла;
//При этом необходимо установить статус родительского узла (если он не выбран, устанавливается только этот узел и все его контакты, а родительские контакты не задействованы)
функция setParent(узел,ПК)
{
вар родительский узел = node.getParent();
если (родительскийузел)
{
вар ParentNodeFather = ParentNode.getParent();
если (родительскийузелотец)
{
setParent(parentNode,Pc);
}
если (ПК)
{parentNode.setAttribute("проверено",Pc);}
еще
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//Проверяем, выбран ли субконтакт, если он выбран, возвращаем true
//Проверяем только узлы первого уровня.
функция checkBrother(parentNode,Pc,NodeData)
{
вар childNodes = новый массив ();
childNodes = родительскийNode.getChildren();
если (childNodes.length > 0)
{
вар bChecked = правда;
for(var i=0;i<childNodes.length;i++)
{
if(childNodes[i].getAttribute("checked") == true && childNodes[i].getAttribute("NodeData") != NodeData)
{
//alert(i+childNodes[i].getAttribute("Текст"));
бПроверено = ложь;
перерыв;
}
}
если (bпроверено)
{
родительскийNode.setAttribute("проверено",Pc);
}
еще
{
//Выбираем все родительские узлы
setParent(parentNode,!Pc)
}
}
еще
{
родительскийNode.setAttribute("проверено",Pc);
}
}
//Получаем статус всех узлов
функция FindCheckedFromNode(узел)
{
вар я = 0;
вар узлы = новый массив ();
узлы = node.getChildren();
for (i = 0; i <= nodes.length - 1; i++)
{
если (узлы[i].getAttribute("Проверено"))
{
AddChecked (узлы [я]);
}
if (parseInt(nodes[i].getChildren().length) != 0 )
{
FindCheckedFromNode (узлы [я]);
}
}
}
//Добавляем выбранный узел
функция AddChecked(узел)
{
document.all.checked.value += node.getAttribute("NodeData") + ",";
}
//-->
</script>У этого метода есть большая проблема: установленный клиентом флажок не может быть получен на стороне сервера. Теперь он может только пройти по дереву во время проверки и поместить значение «Проверено» в текст, а затем отправить его. сервер, а затем сервер будет анализировать символы 1@2 @
Теперь я использую asp.net2.0 и использую следующий метод
функция public_GetParentByTagName (элемент, имя тега)
{
вар родительский = element.parentNode;
вар UpperTagName = tagName.toUpperCase();
//Если этот элемент не является желаемым тегом, продолжаем трассировку вверх
while (родительский && (parent.tagName.toUpperCase() != UpperTagName))
{
родитель = родительский.родительскийузел? родительский.родительскийузел: родительский.родительскийэлемент;
}
вернуть родителя;
}
//Установка родительского узла узла. Cheched — если узел доступен, его родительский узел также должен быть доступен.
функция setParentChecked(objNode)
{
вар objParentDiv = public_GetParentByTagName(objNode,"div");
if(objParentDiv==null || objParentDiv == "не определено")
{
возвращаться;
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("Узлы"));
objID = objID+"Флажок";
вар objParentCheckBox = document.getElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == "не определено")
{
возвращаться;
}
if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "флажок")
возвращаться;
objParentCheckBox.checked = правда;
setParentChecked(objParentCheckBox);
}
//Устанавливаем дочерний узел узла как отключенный — если узел недоступен, его дочерние узлы также будут недоступны.
функция setChildUnChecked (divID)
{
вар objchild = divID.children;
вар счетчик = objchild.length;
for(var i=0;i<objchild.length;i++)
{
вар tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "флажок")
{
tempObj.checked = ложь;
}
setChildUnChecked (tempObj);
}
}
//Устанавливаем дочерний узел узла как проверенный — если к узлу можно получить доступ, его дочерние узлы также будут доступны
функция setChildChecked(divID)
{
вар objchild = divID.children;
вар счетчик = objchild.length;
for(var i=0;i<objchild.length;i++)
{
вар tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "флажок")
{
tempObj.checked = правда;
}
setChildChecked (tempObj);
}
}
// запускаем событие
функция CheckEvent()
{
var objNode = event.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="флажок")
return
if(objNode.checked==true)
{
setParentChecked(objNode);
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Узлы");
if(objParentDiv==null || objParentDiv == "не определено")
{
возвращаться;
}
setChildChecked (objParentDiv);
}
еще
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Узлы");
if(objParentDiv==null || objParentDiv == "не определено")
{
возвращаться;
}
setChildUnChecked (objParentDiv);
}
}Самым большим преимуществом этого метода является то, что сервер может получить значение «Проверено», установленное с помощью JavaScript. Нет необходимости загружать все деревья без нажатия кнопки. Вы можете просто загрузить их один раз на сервер.
//Обходим дочерние узлы
общественная недействительность GetChildNode (узел TreeNode)
{
foreach (узел TreeNode в Node.ChildNodes)
{
если (узел.Проверено)
{
StrChecked += node.Value+"@";
}
GetChildNode (узел);
}
}
}Я все еще могу получить его проверочное значение