<script language="javascript"> 
            function nodeClick(o){ 
                var obj, chk, disp, level, selectValue // 定义变量不说了吧
                obj = event.srcElement; // 将event的srcElement属性赋予obj,注:IE下。此属性和DOM的target属性兼容
// srcElement是指发生事件的文档元素
                if (obj == o) // 如果obj与传过来的参数o相等,则返回
                   return; 
// ----------------这一段的效果是将用户选择了哪几个checkbox显示出来
// 如果元素是INPUT
                if (obj.tagName == "INPUT") { 
                    chk = obj.checked; // 将元素的checked值赋予chk,true or false
// 取得input元素的父元素的样式的第2个字符,即下面的内联样式表中的id为tree,class为l1,l2,l3,l4的那些东西,取得值为1,2,3,4
                    level = parseInt(obj.parentElement.className.substring(1)); 
// 遍历input的父层所有相邻元素
                    while (obj.parentElement.nextSibling && parseInt(obj.parentElement.nextSibling.className.substring(1)) > level) { 
                        obj = obj.parentElement.nextSibling.all.tags("INPUT")[0]; // 又通过父元素找父下面的input子元素
                        obj.checked = chk; // 赋予值,true or false
                    } 
// 作为最上端显示用,不过个人觉得直接用"selectedText"这样写不太严格
                    selectedText.innerHTML = "U have selected: <b>" + getTreeValue() + " </b>"; // 调用了getTreeValue()方法,下有解释
                    return; 
                } 
// 如果元素不存在相邻节点了,则返回
                if (!obj.nextSibling) 
                    return; 
// ----------------这一段的效果是折叠树
                disp = obj.nextSibling.style.display != "none" ? "none" : "block"; // 如果相邻节点的style下的display属性不等于none,则
// 将它(display)设为none,否则设为block
                level = parseInt(obj.className.substring(1)); 
// 遍历obj的相邻节点
                while (obj.nextSibling && parseInt(obj.nextSibling.className.substring(1)) > level) { 
                    obj = obj.nextSibling; 
                    obj.style.display = disp; // 设display属性,显示或折叠起来
                } 
            } 
            
// 此函数为取得已选择的节点,已选择的就把checkbox的值存入数组中
            function getTreeValue(){ 
                var val = []; 
                var objs = document.getElementById("tree").all.tags("INPUT"); 
                for (var i = 0; i < objs.length; i++) 
                    if (objs[i].checked) 
                        val.push(objs[i].value); 
                return val.join(","); 
            } 
        </script> 

解决方案 »

  1.   

    obj.nextSibling返回的是什么呢?
      

  2.   

    那这个方法返回的是什么类型的对象,为什么下面两句话都成立呢?
    1. if (!obj.nextSibling) 
        return; 
    2. obj = obj.nextSibling;
      

  3.   

    这样啊,是不是obj.nextSibling这个方法可以很智能的判断是要返回boolean类型还是兄弟节点的引用类型?
      

  4.   

    不是,是javascript本身的特性
    类型转换,当一个非空对象用在boolean环境中时,它就会被转换成true