javascript - 在 d3.js v4 中以编程方式打开嵌套、折叠(隐藏) Node

标签 javascript jquery node.js d3.js

我正在尝试以编程方式在可折叠树中打开 d3.js Node :
d3_collapsible_tree_viz
我使用以下 d3.js 片段加载数据(在第二级之后折叠 Node ),

d3.json("js/ontology.json", function(error, treeData) {
  if (error) throw error;
  root = d3.hierarchy(treeData, function(d) { return d.children; });
  root.x0 = height / 2;
  root.y0 = 0;
  // Collapse after the second level:
  root.children.forEach(collapse);
  update(root);
});
然后我使用以下 d3.js 代码
var nodeEnter = node.enter().append('g')
    .attr('class', 'node')
    .attr('node-name', d => d.data.name.toLowerCase())
    .attr("transform", function(d) {
      return "translate(" + source.y0 + "," + source.x0 + ")";
  })
.on('click', click);
和这个功能
function expandNode() {
  const node = d3.select('.node[node-name="Nature"]').node();
  console.log('NODE: ', node);
  node.dispatchEvent(new Event('click'));
  }
expandNode();
以编程方式打开“自然” Node 。
但是,当我用“地球”(“自然”的嵌套子 Node ,不可见)替换“自然”(可见 Node )时,这个表达式
const node = d3.select('.node[node-name="Earth"]').node();
只有当它可见时才会展开“地球” Node 。
如果“地球”不可见,该语句将不会扩展“自然”以显示“地球”(并随后扩展“地球”)。
建议?

编辑 1. 这与我之前的 StackOverflow 问题密切相关,
Programmatically opening d3.js v4 collapsible tree nodes?
如果需要,请引用那里引用的 JSFiddle,
https://jsfiddle.net/vstuart/acx5zfgn/62/
标签不同,但数据和代码相似。

编辑 2。后续问题
Accessing promised data in d3.js v6 [programmatically opening nested collapsed nodes]
关系到:
  • d3.js v6;
  • 通过 d3.js 回调/ promise 加载外部 JSON 数据;
  • 这个问题,在那个更新的上下文中。

  • 本体.json
    { "name": "Root",
      "children": [
        { "name": "Culture",
          "children": [
            { "name": "LGBT" }
          ]
        },
    
        { "name": "Nature",
          "id": "nature",
          "children": [
            { "name": "Earth",
              "id": "earth",
              "children": [
                { "name": "Environment" },
                { "name": "Geography" },
                { "name": "Geology" },
                { "name": "Geopolitical" },
                { "name": "Geopolitical - Countries" },
                { "name": "Geopolitical - Countries - Canada" },
                { "name": "Geopolitical - Countries - United States" },
                { "name": "Nature" },
                { "name": "Regions" }
              ]
            },
            { "name": "Cosmos" },
            { "name": "Outer space" }
          ]
        },
    
        { "name": "Humanities",
          "children": [
              { "name": "History" },
              { "name": "Philosophy" },
              { "name": "Philosophy - Theology" }
          ]
        },
    
        { "name": "Miscellaneous",
          "children": [
              { "name": "Wikipedia",
                "url": "https://wikipedia.com" },
              { "name": "Example.com",
                "url": "https://example.com" }
          ]
        },
          
        { "name": "Science",
          "children": [
              { "name": "Biology" },
              { "name": "Health" },
              { "name": "Health - Medicine" },
              { "name": "Sociology" }
          ]
        },
    
        { "name": "Technology",
          "children": [
                { "name": "Computers" },
                { "name": "Computers - Hardware" },
                { "name": "Computers - Software" },
                { "name": "Computing" },
                { "name": "Computing - Programming" },
                { "name": "Internet" },
                { "name": "Space" },
              { "name": "Transportation" }
          ]
        },
    
      { "name": "Society",
          "children": [
                { "name": "Business" },
                { "name": "Economics" },
                { "name": "Economics - Business" },
                { "name": "Economics - Capitalism" },
                { "name": "Economics - Commerce" },
                { "name": "Economics - Finance" },
                { "name": "Politics" },
              { "name": "Public services" }
          ]
        }
      ]
    }
    

    最佳答案

    您需要递归地发现 Node 祖先,然后将它们扩展一:

    const findNodeAncestors = (root, name) => {
      if (root.name === name) {
        return [name];
      }
    
      if (root.children) {
        for (let i = 0; i < root.children.length; i++) {
          const chain = findNodeAncestors(root.children[i], name);
          if (chain) {
            chain.push(root.name);
            return chain;
          }
        }
      }
      return null;
    }; 
       
    
    const chain = findNodeAncestors(treeData.data, 'Earth');
      
    for (let i = chain.length - 1; i >= 0; i--) {
      const node = d3.select(`.node[node-name="${chain[i]}"]`);
      const nodeData = node.datum();
      if (!nodeData.children && nodeData.data.children) {  // Node has children and collapsed
        node.node().dispatchEvent(new Event('click'));     // Expand the node
      }
    }
    
    看到它在 fiddle 中工作.

    关于javascript - 在 d3.js v4 中以编程方式打开嵌套、折叠(隐藏) Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67527258/

    相关文章:

    jquery - 使用JQuery刷新消息,类似于node中的rails flash或connect-flash

    javascript - chrome 扩展上的“不安全评估”

    javascript - id_number 变量在 url 中使用时返回 null

    javascript - document.style.getPropertyValue 与 document.defaultView.ComputedStyles

    javascript - jQuery ajax 导航与 ?代替#

    使用 Node.js 进行 ajax 实时搜索

    javascript - 使用 CORS 仍然会出现跨源错误

    javascript - 尝试将回车符转换为 Javascript 中的 <br/> html 标记?

    javascript - 如何使用ajax onclick将变量传递给另一个php文件

    jQuery 根据值调用函数?