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

如何修改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;
    }
});

关键修复点说明:

  1. this指向问题:
    你之前在setInterval的回调里用this.get_element,这里的this默认是window,不是jstree实例!所以我用const jstreeInstance = this提前保存了实例引用,或者你也可以直接用箭头函数(箭头函数会继承外部作用域的this)。

  2. 定时器的启停逻辑:
    只绑定mousedown是不够的,必须在mouseup(松开鼠标)和mouseleave(鼠标离开箭头)时清除定时器,不然定时器会一直运行,导致无限加载。

  3. 异步加载防重复:
    如果draw_next是异步请求(比如加载后端数据),一定要加isLoading锁,避免按住鼠标时同时发起多个请求,导致数据顺序混乱或者重复加载。

  4. 事件冲突处理:
    加上e.preventDefault()和e.stopPropagation()是为了避免触发jstree本身的点击事件,防止和你的自定义逻辑冲突。

你可以根据自己的实际需求调整定时器的间隔时间(比如100-200ms都比较合适),如果draw_next是同步方法,把加载锁的代码去掉就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:16:07