如何修改jstree代码实现按住鼠标时持续滚动对象?
我来帮你搞定这个按住鼠标持续滚动加载的问题~你之前用mousedown.jstree和setInterval没成功,大概率是this指向出错,加上没处理鼠标松开/离开时的定时器清除逻辑,导致代码跑不起来或者失控。
下面是修正后的完整代码,我会给你拆解关键点:
// 全局(或作用域内)声明定时器变量,用来后续清除 let scrollInterval = null; // 可选:如果draw_next是异步操作,加个加载锁防止重复请求 let isLoading = false; // 绑定鼠标按下事件 .on("mousedown.jstree", ".down-arrow", $.proxy(function (e) { // 阻止默认行为和事件冒泡,避免干扰jstree原生逻辑 e.preventDefault(); e.stopPropagation(); // 保存当前jstree实例的引用,解决setInterval回调里的this指向问题 const jstreeInstance = this; // 启动定时器,每隔150ms触发一次加载(间隔可按需调整) scrollInterval = setInterval(() => { // 如果是异步加载,先判断是否正在加载,避免重复请求 if (isLoading) return; const obj = jstreeInstance.get_element(e.target); obj.page_num += 1; obj.arrow = true; // 假设draw_next是异步方法(比如返回Promise) isLoading = true; jstreeInstance.draw_next(obj).finally(() => { isLoading = false; }); }, 150); }, this)) // 绑定鼠标松开事件:停止定时器 .on("mouseup.jstree", ".down-arrow", () => { if (scrollInterval) { clearInterval(scrollInterval); scrollInterval = null; } }) // 绑定鼠标离开箭头区域事件:防止鼠标按住后移出箭头还继续加载 .on("mouseleave.jstree", ".down-arrow", () => { if (scrollInterval) { clearInterval(scrollInterval); scrollInterval = null; } });
关键修复点说明:
this指向问题:
你之前在setInterval的回调里用this.get_element,这里的this默认是window,不是jstree实例!所以我用const jstreeInstance = this提前保存了实例引用,或者你也可以直接用箭头函数(箭头函数会继承外部作用域的this)。定时器的启停逻辑:
只绑定mousedown是不够的,必须在mouseup(松开鼠标)和mouseleave(鼠标离开箭头)时清除定时器,不然定时器会一直运行,导致无限加载。异步加载防重复:
如果draw_next是异步请求(比如加载后端数据),一定要加isLoading锁,避免按住鼠标时同时发起多个请求,导致数据顺序混乱或者重复加载。事件冲突处理:
加上e.preventDefault()和e.stopPropagation()是为了避免触发jstree本身的点击事件,防止和你的自定义逻辑冲突。
你可以根据自己的实际需求调整定时器的间隔时间(比如100-200ms都比较合适),如果draw_next是同步方法,把加载锁的代码去掉就行。
内容的提问来源于stack exchange,提问作者user7937612
相关产品推荐
相关产品推荐

