2012-05-23 71 views
0

我使用下面的JavaScript與TreeView的節點複選框選擇/取消Functionality.I必須在treeview.parent,子女三個層面和siblings.javascript代碼工作正常,但我需要的兄弟姐妹級別相互依賴地檢查和取消選擇。不影響父母和孩子的檢查/取消選中。有一個PLZ幫助我修改代碼。使用JavaScript與TreeView的節點選擇/取消功能

<script type="text/javascript"> 
     function OnTreeClick(evt) { 
      var src = window.event != window.undefined ? window.event.srcElement : evt.target 
      var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox"); 
      if (isChkBoxClick) { 
       var parentTable = GetParentByTagName("table", src); 
       var nxtSibling = parentTable.nextSibling; 
       if (nxtSibling && nxtSibling.nodeType == 1)//check if nxt sibling is not null & is an element node 
       { 
        if (nxtSibling.tagName.toLowerCase() == "div") //if node has children 
        { 
         //check or uncheck children at all levels 
         CheckUncheckChildren(parentTable.nextSibling, src.checked); 
        } 
       } 
       //check or uncheck parents at all levels 
       CheckUncheckParents(src, src.checked); 
      } 
     } 

     function CheckUncheckChildren(childContainer, check) { 
      var childChkBoxes = childContainer.getElementsByTagName("input"); 
      var childChkBoxCount = childChkBoxes.length; 
      for (var i = 0; i < childChkBoxCount; i++) { 
       childChkBoxes[i].checked = check; 
      } 
     } 

     function CheckUncheckParents(srcChild, check) { 
      var parentDiv = GetParentByTagName("div", srcChild); 
      var parentNodeTable = parentDiv.previousSibling; 

      if (parentNodeTable) { 
       var checkUncheckSwitch; 

       if (check) //checkbox checked 
       { 
        checkUncheckSwitch = true; 
       } 
       else //checkbox unchecked 
       { 
        var isAllSiblingsUnChecked = AreAllSiblingsUnChecked(srcChild); 
        if (!isAllSiblingsUnChecked) 
         checkUncheckSwitch = true; 
        else 
         checkUncheckSwitch = false; 
       } 

       var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input"); 
       if (inpElemsInParentTable.length > 0) { 
        var parentNodeChkBox = inpElemsInParentTable[0]; 
        parentNodeChkBox.checked = checkUncheckSwitch; 
        //do the same recursively 
        CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch); 
       } 
      } 
     } 

     function AreAllSiblingsUnChecked(chkBox) { 
      var parentDiv = GetParentByTagName("div", chkBox); 
      var childCount = parentDiv.childNodes.length; 
      for (var i = 0; i < childCount; i++) { 
       if (parentDiv.childNodes[i].nodeType == 1) //check if the child node is an element node 
       { 
        if (parentDiv.childNodes[i].tagName.toLowerCase() == "table") { 
         var prevChkBox = parentDiv.childNodes[i].getElementsByTagName("input")[0]; 
         //if any of sibling nodes are not checked, return false 
         if (prevChkBox.checked) { 
          return false; 
         } 
        } 
       } 
      } 
      return true; 
     } 

     //utility function to get the container of an element by tagname 
     function GetParentByTagName(parentTagName, childElementObj) { 
      var parent = childElementObj.parentNode; 
      while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) { 
       parent = parent.parentNode; 
      } 
      return parent; 
     } 
    </script> 

回答

0
// trvTest.Attributes.Add("onclick", "OnCheckBoxCheckChanged(event)"); 

function OnCheckBoxCheckChanged(event) 
     { 
      var obj = window.event.srcElement; 
      var treeNodeFound = false; 
      var checkedState; 
      if (obj.tagName == "INPUT" && obj.type == "checkbox") 
      { 
       var treeNode = obj; 
       checkedState = treeNode.checked; 
       do 
       { 
        obj = obj.parentElement; 
       } 

       while (obj.tagName != "TABLE") 
       var parentTreeLevel = obj.rows[0].cells.length; 
       var parentTreeNode = obj.rows[0].cells[0]; 
       var tables = obj.parentElement.getElementsByTagName("TABLE"); 
       var numTables = tables.length 
       if (numTables >= 1) 
       { 
        for (i=0; i < numTables; i++) 
        { 
         if (tables[i] == obj) 
         { 
          treeNodeFound = true; 
          i++; 
          if (i == numTables) 
          { 
           return; 
          } 
         } 
         if (treeNodeFound == true) 
         { 
          var childTreeLevel = tables[i].rows[0].cells.length; 
          if (childTreeLevel > parentTreeLevel) 
          { 
           var cell = tables[i].rows[0].cells[childTreeLevel - 1]; 
           var inputs = cell.getElementsByTagName("INPUT"); 
           if (inputs.length > 0) 
            inputs[0].checked = checkedState; 
          } 
          else 
          { 
           return; 
          } 
         } 
        } 
       } 
      } 
     } 
+0

這是一個很大的代碼,沒有解釋的。 –