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

Kendo Org Chart选择事件持续触发问题求助

Kendo Org Chart select事件重复触发问题解决

问题场景

使用基础版Kendo Org Chart时,点击节点触发select事件弹出alert(或业务中提交表单打开新页面),关闭弹窗/完成操作后select事件会再次触发,导致逻辑重复执行。

当前代码示例:

$("#orgchart").kendoOrgChart({
    editable: false,
    dataSource: dataSource,
    select: onSelect,
});

function onSelect(e) {
    e.preventDefault();
    alert(e.dataItems[0].id);
};

解决方案

问题根源是弹窗关闭后,焦点回到Org Chart节点,会再次触发select事件。以下是几种可行的解决方式:

方式1:标志位控制触发状态

添加一个状态标记,拦截重复触发的事件:

let isHandlingSelect = false;

$("#orgchart").kendoOrgChart({
    editable: false,
    dataSource: dataSource,
    select: onSelect,
});

function onSelect(e) {
    e.preventDefault();
    if (isHandlingSelect) {
        isHandlingSelect = false;
        return;
    }
    isHandlingSelect = true;
    alert(e.dataItems[0].id);
};

方式2:临时解绑再重新绑定事件

在执行业务逻辑前临时解绑select事件,完成后延迟重新绑定:

function onSelect(e) {
    e.preventDefault();
    const orgChartInstance = $("#orgchart").data("kendoOrgChart");
    // 临时解绑事件
    orgChartInstance.unbind("select");
    
    alert(e.dataItems[0].id);
    
    // 延迟重新绑定,避开焦点回归的触发时机
    setTimeout(() => {
        orgChartInstance.bind("select", onSelect);
    }, 100);
};

$("#orgchart").kendoOrgChart({
    editable: false,
    dataSource: dataSource,
    select: onSelect,
});

方式3:利用事件属性区分触发源(部分版本适用)

部分Kendo UI版本中,事件对象带有isTrigger属性,可用来区分用户手动触发和代码自动触发:

function onSelect(e) {
    e.preventDefault();
    // 跳过代码触发的重复事件
    if (e.isTrigger) return;
    alert(e.dataItems[0].id);
};

原理说明

当alert弹窗关闭后,浏览器会将焦点重新定位到之前点击的Org Chart节点,而Kendo Org Chart的节点在获取焦点时会再次触发select事件,导致逻辑重复执行。上述方案通过拦截重复触发、临时阻断事件绑定等方式,避免了重复执行问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:52:03