javascript - 带有 JavaScript 的树无法正常工作

标签 javascript jquery html css

我的 JavaScript 需要一些帮助,因为在我测试它时它的行为很奇怪。问题是,每当我在绿色阴影区域中单击 P1、P2、Cello、C2、C1 的最左侧时,我的树就会折叠回 Item,这应该不会发生。它应该有点像,如果我点击 parkercell 或元素,它的子部分将被关闭或打开。

FIDDLE


var dataSource = ({
    "Pen": ({
        "Parker": ({
            "P1": ({}),
                "P2": ({})
        }),
            "Cello": ({
            "C2": ({}),
                "C1": ({})
        })
    })
}),
    Objectkeys = function(obj){
        a = []
        for(var prop in obj){
            if (obj.hasOwnProperty(prop)) {
             a.push(prop);
            }
        };
        return a;
    },
    traverseObject = function (obj) {
        var ul = document.createElement("ul"),
            li,span;

        for (var prop in obj) {
            li = document.createElement("li");
            li.appendChild(document.createTextNode(prop));
            li.style.backgroundColor = "green";
            li.onclick = function(e) {
                var classNames = this.className;
                if (classNames.indexOf("hidden") == -1) {
                    this.className += "hidden";
                } else {
                    this.className = this.className.replace("hidden", "");
                }
                if (!e)
                    e = window.event;
                    if (e.stopPropagation) {
                      e.stopPropagation();
                    }
                else {
                    e.cancelBubble = true;
                }
            }
            if (typeof obj[prop] == "object" && Objectkeys(obj[prop]).length) {

                li.appendChild(traverseObject(obj[prop]));
            } else {
                li.className += "leaf";
            }
            ul.appendChild(li);
            console.log(ul);
        }
        return ul;
    },
    sortedObject = function (obj) {
        document.getElementById("dvList2").innerHTML = "";
        var ul = document.createElement("ul"),
            li,keys = Objectkeys(obj).sort();
        for (prop in keys) {
        var li = document.createElement("li");
            li.appendChild(document.createTextNode(keys[prop]));
            li.onclick = function(e) {
                var classNames = this.className;
                if (classNames.indexOf("hidden") == -1) {
                    this.className += "hidden";
                } else {
                    this.className = this.className.replace("hidden", "");
                }
                if (!e)
                    e = window.event;
                    if (e.stopPropagation) {
                      e.stopPropagation();
                    }
                else {
                    e.cancelBubble = true;
                }
            }
            if (typeof obj[keys[prop]] == "object" && Objectkeys(obj[keys[prop]]).length) {
                li.appendChild(sortedObject(obj[keys[prop]]));
            } else {
                li.className += "leaf";
            }
            ul.appendChild(li);
            console.log(ul);
        }
        return ul;
    };
window.onload = function () {
    document.getElementById("dvList1").appendChild(traverseObject(dataSource));
    document.getElementById("hlGSL").onclick = function(){document.getElementById("dvList2").appendChild(sortedObject(dataSource));}
}

谢谢

最佳答案

你的 li.onclick = function(e) { }正在注册最外面的 <li>嵌套树的元素。添加一个语句来确保用户点击的实际上是一个子节点。

...
li.style.backgroundColor = "green";
li.onclick = function(e) {

    // Is the parent's parent the dvList1 <div>?

    if (li.parent.parent.id == "dvList1") {

         // Do nothing       

    } else {

    // If it isn't, do the rest of the code

        var classNames = this.className;
        if (classNames.indexOf("hidden") == -1) {
             this.className += "hidden";
        } else {
             this.className = this.className.replace("hidden", "");
        }

...

关于javascript - 带有 JavaScript 的树无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21781567/

相关文章:

jquery - 使用 jQuery 获取 URL 的一部分

jquery - 如何设置 jQuery 数据表的标题部分 excel 导出的第一行的高度

html - 如何将 HTML 表单数据发送到 Google 表格?

javascript - document.body scrollTop 在 chrome 中返回 0 但在 firefox 中不返回

jquery - 使用递增的类名将类应用于类似命名的 div

html - 如何在 Internet Explorer 的 XSL 文档中包含 CSS 样式表?

javascript - 使 body 为浏览器窗口的 100% 高度

javascript - 如何更改单选按钮的值

javascript - Dijit 选择,组合框中的项目已禁用 = true 不起作用

javascript - 使用 VueJS 过滤复选框