1. 程式人生 > >【JAVASCRIPT】使用ztree樹,實現右鍵增加,修改,刪除節點。帶有複選框。

【JAVASCRIPT】使用ztree樹,實現右鍵增加,修改,刪除節點。帶有複選框。

測試支援火狐,谷歌,IE10等。

主要使用ztree,擁有複選框,增加,修改,刪除功能,這些是要連線後臺的,自己再修改下就可以用。

效果如下圖:

點選增加後會出現

程式碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>ZTREE DEMO - select menu</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="css/demo.css" type="text/css">
    <link rel="stylesheet" href="css/zTreeStyle/zTreeStyle.css" type="text/css">
    <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
    <script type="text/javascript" src="js/jquery.ztree.core-3.5.js"></script>
    <script type="text/javascript" src="js/jquery.ztree.excheck-3.5.js"></script>
    <script type="text/javascript" src="js/jquery.ztree.exedit-3.5.js"></script>
    <script type="text/javascript">
		<!--
        var setting = {
            view: {
                dblClickExpand: false
            },
            data: {
                simpleData: {
                    enable: true
                }
            },
            check: {
                enable: true
            },
            callback: {
                onRightClick: OnRightClick
            }
        };

        var zNodes = [
			{ id: 1, pId: 0, name: "隨意勾選 1", open: true },
			{ id: 11, pId: 1, name: "隨意勾選 1-1", open: true },
			{ id: 111, pId: 11, name: "隨意勾選 1-1-1" },
			{ id: 112, pId: 11, name: "隨意勾選 1-1-2" },
			{ id: 12, pId: 1, name: "隨意勾選 1-2", open: true },
			{ id: 121, pId: 12, name: "隨意勾選 1-2-1" },
			{ id: 122, pId: 12, name: "隨意勾選 1-2-2" },
			{ id: 2, pId: 0, name: "隨意勾選 2", checked: true, open: true },
			{ id: 21, pId: 2, name: "隨意勾選 2-1" },
			{ id: 22, pId: 2, name: "隨意勾選 2-2", open: true },
			{ id: 221, pId: 22, name: "隨意勾選 2-2-1", checked: true },
			{ id: 222, pId: 22, name: "隨意勾選 2-2-2" },
			{ id: 23, pId: 2, name: "隨意勾選 2-3" }
		];

        function OnRightClick(event, treeId, treeNode) {
            if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) {
                zTree.cancelSelectedNode();
                showRMenu("root", event.clientX, event.clientY);
            } else if (treeNode && !treeNode.noR) {
                zTree.selectNode(treeNode);
                showRMenu("node", event.clientX, event.clientY);
            }
        }

        function showRMenu(type, x, y) {
            $("#rMenu ul").show();
            if (type == "root") {
                $("#m_del").hide();
                $("#m_check").hide();
                $("#m_unCheck").hide();
            } else {
                $("#m_del").show();
                $("#m_check").show();
                $("#m_unCheck").show();
            }
            rMenu.css({ "top": y + "px", "left": x + "px", "visibility": "visible" });
            $("body").bind("mousedown", onBodyMouseDown);
        }
        function hideRMenu() {
            if (rMenu) rMenu.css({ "visibility": "hidden" });
            $("body").unbind("mousedown", onBodyMouseDown);
        }

        //顯示右鍵
        function showRMenu(type, x, y) {
            $("#rMenu").show();
            if (type == "root") {
                $("#rMenu").hide();
            } else {
                $("#m_del").show();
                $("#m_modify").show();
            }
            //0000000,0000001,0000002,不可以刪除修改	
            zTree = $.fn.zTree.getZTreeObj("treeDemo");
            nodes = zTree.getSelectedNodes();
            treeNode = nodes[0];
            if (treeNode != null) {
                treeID = treeNode.id;
                if (treeID == '00000000' || treeID == '00000001' || treeID == '00000002') {
                    $("#m_modify").hide();
                    $("#m_del").hide();
                }
            }

            rMenu.css({ "top": y + "px", "left": x + "px", "visibility": "visible" });
            $("body").bind("mousedown", onBodyMouseDown);
        }


        //隱藏右鍵
        function hideRMenu() {
            alert();
            if (rMenu) rMenu.css({ "visibility": "hidden" });
            $("body").unbind("mousedown", onBodyMouseDown);
        }


        function onBodyMouseDown(event) {
            if (!(event.target.id == "rMenu" || $(event.target).parents("#rMenu").length > 0)) {
                rMenu.css({ "visibility": "hidden" });
            }
            if (!(event.target.id == "rMenu2" || $(event.target).parents("#rMenu2").length > 0)) {
                $("#rMenu2").css({ "visibility": "hidden" });
            }
        }

        //滑鼠點選事件不在節點上時隱藏右鍵選單   
        $(function () {
            $("body").bind(
            "mousedown",
            function (event) {
                if (!(event.target.id == "rMenu2" || $(event.target)
                        .parents("#rMenu2").length > 0)) {
                    $("#rMenu2").hide();
                }
            });
        });

        /*******************新增  start*********************/
        //顯示新增
        function showRMenu2(x, y) {
            $("#rMenu2").show();
            $("#rMenu2").css({ "top": y + "px", "left": x + "px", "visibility": "visible" });
            $("body").bind("mousedown", onBodyMouseDown);
        }

        var addCount = 1;
        //新增樹節點
        function addTreeNode() {
            $("#rMenu").hide();
            //顯示新增div
            var tag = 0;
            $("#treeDemo").mousemove(function (e) {
                if (tag == 0) showRMenu2(e.pageX, e.pageY);
                $("#caption_bbs").focus();
                tag = tag + 1;
            });
        }


        //新增執行後臺
        function addTree() {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            var nodes = zTree.getSelectedNodes();
            $.ajax({
                type: "post",
                url: "/cslv/documentation.do",
                dataType: 'json',
                data: {
                    action: "addTree",
                    parentid: nodes[0].id,
                    nodename: $("#caption_bbs").val()
                },
                success: function (json) {
                    //強行載入父節點
                    var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
                    var nodes = treeObj.getSelectedNodes();
                    treeObj.reAsyncChildNodes(null, "refresh", true);
                    if (json == 0) alert("操作失敗!");
                },
                error: function () {
                    alert('Error loading HTML document');
                }
            });
            $("#rMenu2").css({ "visibility": "hidden" });
            $("#caption_bbs").val("");

        }
        /*******************新增  end*********************/

        /*******************修改  start*********************/
        function editName() {
            $("#rMenu").hide();
            zTree = $.fn.zTree.getZTreeObj("treeDemo");
            nodes = zTree.getSelectedNodes();
            zTree.editName(nodes[0]);
        }

        //捕獲節點編輯名稱結束(Input 失去焦點 或 按下 Enter 鍵)之後,更新節點名稱資料之前的事件回撥函式,並且根據返回值確定是否允許更改名稱的操作
        function onRename(treeId, treeNode, newName) {
            zTree = $.fn.zTree.getZTreeObj("treeDemo");
            nodes = zTree.getSelectedNodes();
            treeId = "treeDemo";
            treeNode = nodes[0];
            newName = nodes[0].name;
            if (newName.length == 0) {
                alert("節點名稱不能為空.");
                return false;
            }
            $.ajax({
                type: "post",
                url: "/cslv/documentation.do",
                dataType: 'json',
                data: {
                    action: "modifyTree",
                    id: nodes[0].id,
                    nodename: newName
                },
                success: function (json) {
                    alert('操作成功!');
                },
                error: function () {
                    alert('Error loading HTML document');
                }
            });
            return true;
        }
        /*******************修改  end*********************/
        function removeTreeNode() {
            hideRMenu();
            var nodes = zTree.getSelectedNodes();
            if (nodes && nodes.length > 0) {
                if (nodes[0].children && nodes[0].children.length > 0) {
                    var msg = "要刪除的節點是父節點,如果刪除將連同子節點一起刪掉。\n\n請確認!";
                    if (confirm(msg) == true) {
                        zTree.removeNode(nodes[0]);
                    }
                } else {
                    zTree.removeNode(nodes[0]);
                }
            }
        }
        function checkTreeNode(checked) {
            var nodes = zTree.getSelectedNodes();
            if (nodes && nodes.length > 0) {
                zTree.checkNode(nodes[0], checked, true);
            }
            hideRMenu();
        }
        function resetTree() {
            hideRMenu();
            $.fn.zTree.init($("#treeDemo"), setting, zNodes);
        }

        function setCheck() {
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            var nodes = zTree.transformToArray(zTree.getNodes());
            //設定跟節點不顯示覆選框
            for (var i = 0; i < nodes.length; i++) {
                var id = nodes[i].id;
                for (var j = 0; j < nodes.length; j++) {
                    if (id == nodes[j].pId) {
                        node = zTree.getNodeByParam("id", id, null);
                        node.nocheck = true;
                        zTree.updateNode(node);
                    }
                }
            }
        }

        //初始化樹
        var zTree, rMenu;
        $(document).ready(function () {
            $.fn.zTree.init($("#treeDemo"), setting, zNodes);
            setCheck();
            zTree = $.fn.zTree.getZTreeObj("treeDemo");
            rMenu = $("#rMenu");
        });
        //-->

        function submit() {
            var tree = $.fn.zTree.getZTreeObj("treeDemo");
            var nodes = tree.transformToArray(tree.getCheckedNodes(true));
            var nodesArr = new Array();
            var aHtml = "";
            for (var i = 0; i < nodes.length; i++) {
                nodesArr[i] = nodes[i].name;
                if (i / 5 == 1) {
                    aHtml += "<br/>"
                }
                aHtml += "<input type='checkbox' name='checkbox' value='" + nodes[i].id + "' checked>" + nodes[i].name;
            }
            $("#text").val(nodesArr.join(","));


            document.getElementById("ckDiv").innerHTML = aHtml;
        }
		
		
    </script>
    <style type="text/css">
        div#rMenu
        {
            position: absolute;
            visibility: hidden;
            top: 0;
            background-color: #555;
            text-align: left;
            padding: 2px;
        }
        div#rMenu ul li
        {
            margin: 1px 0;
            padding: 0 5px;
            cursor: pointer;
            list-style: none outside none;
            background-color: #DFDFDF;
        }
        div#rMenu2
        {
            position: absolute;
            visibility: hidden;
            background-color: #555;
            text-align: left;
            padding: 2px;
        }
        
        div#rMenu2 ul
        {
            margin: 1px 0;
            padding: 0 5px;
            cursor: pointer;
            list-style: none outside none;
            background-color: #DFDFDF;
        }
    </style>
</head>
<body>
    <div class="content_wrap">
        <input id="text" type="text" value="" size="200">
        <div id="ckDiv">
        </div>
        <div class="zTreeDemoBackground left">
            <ul id="treeDemo" class="ztree">
            </ul>
            <input id="text" type="button" onclick="submit()" value="確定">
        </div>
    </div>
    <!-- 隱藏新增 -->
    <div id="rMenu2">
        <ul>
            <li>名稱:
                <input type="text" class="input_tx" id="caption_bbs" style="width: 100px; height: 16px;" />
                <a class="orange" onclick="addTree();">確定</a> </li>
        </ul>
    </div>
    <!-- 右鍵樹 -->
    <div id="rMenu">
        <ul>
            <li id="m_add" onclick="addTreeNode();">增加 </li>
            <li id="m_modify" onclick="editName()">修改 </li>
            <li id="m_del" onclick="removeTreeNode();">刪除 </li>
        </ul>
    </div>
</body>
</html>

註釋很詳細了。原始檔完美執行地址: