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

调用$(...).jstree提示is not a function,疑因调用时机导致

问题描述

我尝试从AJAX源获取jsTree的配置数据,虽然能正常从后端拿到数据,但在配置jsTree时总是报TypeError: $(...).jstree is not a function错误。进一步排查发现,哪怕用硬编码的配置,只要放在AJAX的success回调里就会报错,直接在全局作用域调用却完全正常,两段代码完全一致。

测试代码如下:

<div id="jstree_demo_div"></div>

<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min.js"></script>

<script>
    $(document).ready(function() {
        $.ajax({
            type: "get",
            url: "https://localhost:44366/Dashboard/JsTree?handler=ArrayData",
            contentType: "application/x-www-form-urlencoded",
            success: function (data) {
                // 1 - 这里调用会报错,代码和下面的#2完全一致
                $('#jstree_demo_div').jstree({ 'core' : { 'data' : [ 'First', 'Second' ] } });
            }
        });
    });

    // 2 - 启用这段就正常工作
    //$('#jstree_demo_div').jstree({ 'core' : { 'data' : [ 'First', 'Second' ] } });
</script>

我试过用$(window).load()替换$(document).ready(),但问题依旧。有没有人遇到过类似问题?


解决方案

这种情况90%是jQuery实例被覆盖导致的:

  • 检查你的AJAX请求目标页面(Dashboard/JsTree?handler=ArrayData)的返回内容,是否不小心重新引入了jQuery?如果后端返回的HTML或JS里又加载了一次jQuery,会覆盖当前页面已经绑定了jstree插件的jQuery实例,导致回调里的$不再指向带有jstree的那个jQuery。
  • 或者页面其他位置存在重复引入jQuery的情况,比如某些第三方脚本偷偷加载了另一个版本的jQuery。

解决步骤:

  1. 排查重复jQuery引入:打开浏览器开发者工具的Network面板,过滤JS请求,看看除了你手动引入的jquery-1.11.1.min.js之外,有没有其他jQuery文件被加载。如果有,删掉多余的引入。
  2. 锁定jQuery实例:如果无法避免多个jQuery共存,在页面加载时先保存绑定了jstree的jQuery引用:
    // 放在jQuery和jstree加载之后
    const $j = jQuery.noConflict(true);
    
    然后所有用到jQuery和jstree的地方都用$j代替$:
    $j(document).ready(function() {
        $j.ajax({
            type: "get",
            url: "https://localhost:44366/Dashboard/JsTree?handler=ArrayData",
            contentType: "application/x-www-form-urlencoded",
            success: function (data) {
                $j('#jstree_demo_div').jstree({ 'core' : { 'data' : [ 'First', 'Second' ] } });
            }
        });
    });
    
  3. 验证回调中的jQuery上下文:可以在success回调里先打印console.log($.fn.jstree),如果输出undefined,就实锤是jQuery实例被替换了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:28:28