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

如何让JSTree.js中LI元素的属性保留更新后的值?

解决jstree节点属性修改后无法同步的问题

这个问题我之前也碰到过——直接用jQuery修改DOM元素的data-cmsid属性,浏览器代码视图看着改了,但jstree根本不认,因为jstree会把节点的所有状态(包括自定义属性)存在自己的内部数据结构里,DOM只是它的渲染层,直接改DOM不会同步到内部数据,下次树刷新或者操作(比如拖拽)的时候,又会变回原来的值。

下面是具体的解决步骤,结合你的拖拽场景一起说明:

1. 用jstree API修改节点属性,而非直接操作DOM

别再用$('li#some-node').attr('data-cmsid', newVal)这种方式了,改用jstree提供的方法修改内部数据,再同步到DOM:

// 1. 获取目标节点的jstree对象(支持通过节点ID、DOM元素或选择器获取)
const node = $('#your-tree').jstree(true).get_node('target-node-id');

// 2. 修改节点的自定义属性(jstree会把自定义data属性存在node.data字段中)
node.data.cmsid = '新的CMSID值';

// 3. 让jstree刷新该节点,同步内部数据到DOM
// refresh_node会重新加载节点数据并渲染
$('#your-tree').jstree(true).refresh_node(node);
// 也可以用redraw_node,它仅重新渲染节点,适合属性变更的轻量场景
// $('#your-tree').jstree(true).redraw_node(node, false);

如果是通过DOM元素定位节点,也可以这样写:

const $targetLi = $('li.some-target-selector');
const node = $('#your-tree').jstree(true).get_node($targetLi);
// 后续修改步骤同上

2. 拖拽场景下的属性同步

因为你还在用拖拽功能,拖拽完成后节点位置变化,需要确保属性正确保留或更新。可以监听jstree的move_node事件,在拖拽结束后处理属性:

$('#your-tree').on('move_node.jstree', function(e, data) {
  // data.node就是被拖拽的节点对象
  // 拖拽后如果需要更新它的data-cmsid,直接修改node.data即可
  data.node.data.cmsid = '拖拽后的新属性值';
  // 同步到DOM
  $(this).jstree(true).refresh_node(data.node);
  
  // 如果需要同步其他关联节点的属性,也可以在这个事件里处理
});

3. 验证修改是否生效

修改后可以通过以下方式确认内部数据是否更新:

const node = $('#your-tree').jstree(true).get_node('target-node-id');
console.log(node.data.cmsid); // 应该输出你设置的新值

这样操作后,不管是树刷新还是拖拽操作,jstree都会使用你更新后的属性值,不会再回到原来的状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:28