zTreeは、jQueryで実装された多機能な「ツリープラグイン」です。この記事では、jQuery zTree の非同期読み込みで子ノードを追加する際の重複の問題について説明します。必要な方は参考にしてください
zTree の紹介
zTree は多機能な「ツリープラグ」です。 -in」は jQuery によって実装されます。 zTree の最大の利点は、優れたパフォーマンス、柔軟な構成、複数の機能の組み合わせです。
zTree はオープンソースのフリー ソフトウェア (MIT ライセンス) です。 zTree に興味がある場合、または zTree の継続的な開発に資金を提供したい場合は、寄付を行うことができます。
zTree v3.0は機能ごとにコアコードを分割しており、不要なコードをロードする必要がありません
は遅延ロード技術を採用しており、数万のノードを簡単にロードでき、基本的には実現できます。 IE6 でも即時販売
IE、FireFox、Chrome、Opera、Safari およびその他のブラウザと互換性があります
JSON データをサポートします
ノード データの静的および Ajax 非同期読み込みをサポートします
スキン変更/カスタムアイコン(CSSに依存)
非常に柔軟なチェックボックスまたはラジオ選択機能をサポート
さまざまなイベント応答コールバックを提供
柔軟な編集(追加/削除/変更/チェック)機能、ノードを自由にドラッグアンドドロップでき、複数のノードをドラッグできます
1つのページ内で複数のTreeインスタンスを同時に生成できます
柔軟で変更可能な機能を実現するシンプルなパラメータ構成
元の質問
//添加结点, 产品和版本 function addNode(event) { rMenu.css({ "visibility": "hidden" }); var treeNode = zTree.getSelectedNodes()[0]; var pid; var nodeName; var treelevel; if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) { //添加产品结点 pid = 0; treeNode = null; treelevel = 1; } else if (treeNode) { //添加版本结点 pid = treeNode.id; treelevel = 2; } $.post( "AddNode.action", { type: treelevel, id: pid }, function(nodeIdAndName) { var params = /([^\|]+)\|([^\|]+)/.exec(nodeIdAndName); if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) { zTree.expandNode(treeNode, true); } treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel }); }); }
もともと直接 子ノードを追加するとき、親ノードが展開されていない場合、2つの同じ子ノードが追加されます(最初)。親ノードが展開されているかどうかを後で判断しましたが、親ノードが展開されている場合は次のようになります。親ノードが展開されると、(初めて) 2 つの同一の子ノードを追加するときにこの問題を解決するにはどうすればよいですか?
方法1
if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) { zTree.expandNode(treeNode, true); } treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
を
if(!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) { treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel }); } else if(treeNode.open) { if(treeNode.isParent) { zTree.reAsyncChildNodes(treeNode, "refresh"); } else { treeNode.isParent=true; zTree.reAsyncChildNodes(treeNode, "refresh"); } } else { zTree.expandNode(treeNode, true); treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel }); }
に変更する 問題は解決できますが、最適化はありますか?変更後はコードカテゴリが多すぎる気がします
一番いい方法
そんなに面倒じゃなくても良さそうですよね。 2日前にも同様の質問に回答しました。
1. クリックして子ノードを追加した後、ajax をバックグラウンドに直接送信してデータを保存し、成功イベントをキャプチャします。
2. ajax が成功したら、treeNode.zAsync 属性を使用して親ノードかどうかを確認できます。 false の場合は、reAsyncChildNodes を直接更新します。true の場合は、addN を使用します。
関連記事:
nodeのvueプロジェクトでフロントエンドとバックエンドの分離を実現する方法JSでスタックを表す2つのキューを実装する方法Vueでの実装方法単一ページのスケルトン画面以上がzTree を使用した非同期ロード (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。