You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AJAX动态加载数据渲染Destroydrop dtree树形组件

解决方案

问题的核心原因是:页面加载完成后调用document.write()会清空当前页面的所有原有内容,重写整个文档。而Destroydrop dtree实例本身的toString()方法会直接返回渲染树所需的完整HTML字符串,我们只需要把这段字符串插入到指定容器即可,完全不需要调用document.write()。

另外你提到的script标签内的<!--和//-->是上古时期兼容不支持JS的浏览器的遗留写法,现在没有任何实际作用,直接忽略即可,不需要做特殊处理。


步骤1:提前在页面添加树容器

不要用动态修改script标签内容的方式实现渲染,先在页面固定位置预留好树的挂载容器:

<div class="dtree" id="treeContainer">
  <p><a href="javascript: d.openAll();">全部展开</a> | <a href="javascript: d.closeAll();">全部收起</a></p>
  <!-- 动态生成的树内容会插入到此处 -->
</div>

步骤2:动态渲染树的两种实现方式

方式1(更安全,优先推荐):只从接口拿节点数据,本地手动构造树

不要直接执行接口返回的整段代码,只需要让接口返回节点数组,本地初始化dtree后批量插入节点即可:

// 假设AJAX请求拿到的节点数据格式如下
const nodeList = [
  {id:0, pid:-1, name:'我的示例树', url:''},
  {id:1, pid:0, name:'节点1', url:'example01.html'},
  {id:2, pid:0, name:'节点2', url:'example01.html'},
  // 其余节点...
]

// 初始化dtree实例
const d = new dTree('d')
// 批量添加节点
nodeList.forEach(node => {
  d.add(
    node.id, 
    node.pid, 
    node.name, 
    node.url || '', 
    node.title || '', 
    node.target || '', 
    node.icon || ''
  )
})
// 把生成的树HTML插入到预留容器中
document.getElementById('treeContainer').innerHTML += d.toString()

方式2:必须直接使用接口返回的整段构造代码的情况

如果接口已经固定返回完整的dtree构造代码,只需要把代码里的document.write(d)替换为插入容器的逻辑再执行即可:

// 假设从接口拿到的完整代码字符串为treeCode
let treeCode = `
d = new dTree('d');
d.add(0,-1,'My example tree');
d.add(1,0,'Node 1','example01.html');
d.add(2,0,'Node 2','example01.html');
document.write(d);
`
// 替换掉会清空页面的document.write逻辑
treeCode = treeCode.replace('document.write(d)', "document.getElementById('treeContainer').innerHTML += d.toString()")
// 执行处理后的代码
eval(treeCode)

之前方案失效的原因说明

  • 动态修改script标签的innerHTML不会触发代码执行,浏览器仅会在首次解析到script标签时执行一次内部代码,后续修改内容不会重新执行
  • 之前用eval执行失败的核心原因是代码里包含document.write(d),执行后直接清空了页面,替换掉这行即可正常运行

内容的提问来源于stack exchange,提问作者Danystatic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:01