调用$(...).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。
解决步骤:
- 排查重复jQuery引入:打开浏览器开发者工具的Network面板,过滤JS请求,看看除了你手动引入的
jquery-1.11.1.min.js之外,有没有其他jQuery文件被加载。如果有,删掉多余的引入。 - 锁定jQuery实例:如果无法避免多个jQuery共存,在页面加载时先保存绑定了jstree的jQuery引用:
然后所有用到jQuery和jstree的地方都用// 放在jQuery和jstree加载之后 const $j = jQuery.noConflict(true);$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' ] } }); } }); }); - 验证回调中的jQuery上下文:可以在success回调里先打印
console.log($.fn.jstree),如果输出undefined,就实锤是jQuery实例被替换了。
内容的提问来源于stack exchange,提问作者Robert Barron
相关产品推荐
相关产品推荐

