【问题标题】:Working with different versions of jQuery使用不同版本的 jQuery
【发布时间】:2017-10-06 12:42:58
【问题描述】:

用例

我在 jstree 和 jquery-ui datepicker 之间遇到了冲突。

我正在尝试在 AJAX 请求后在 DOM 中注入的输入上使用 jquery-ui-datepicker。

我正在使用使用 jQuery 3.1.1 的 jsTree 3.3 和使用 jQuery 1.12.4 的 jQueryUI v1.12.1。 问题

当我尝试调用 $('#datepicker').datepicker() 时,它会抛出 TypeError

(...).datepicker 不是函数

到目前为止我已经尝试过什么

根据许多其他主题,包括以下两个:

datepicker 和 jstree 或 multipul 之间的冲突

将 datepicker() 放在动态创建的元素上 - JQuery/JQueryUI

我的代码如下所示:

HTML:

<script src="{% static 'Syc/js/jquery.js' %}"></script>
<script src="{% static 'Syc/js/jquery-old.js' %}"></script> <!-- version1.12.14-->
<script src="{% static 'Syc/js/jquery-ui/jquery-ui.js' %}"></script>
<script src="{% static 'Syc/Jstree/dist/jstree.min.js' %}"></script>

Javascript:

$(document).on('focus', "[id^='Date']", function () {
var jQ = jQuery.noConflict(true);
jQ.getScript('path/jquery-old.js', function () {
    jQ(function () {
        jQ(this).datepicker();
    })
});

上面的代码当前被放置在向 DOM 中注入输入的函数的成功回调中。

这是我的 JS 的最高级版本,我尝试过不使用 getScript,我尝试将它放置在 jstree 对象创建之前/之后。我不知道我缺少什么或使 datepicker() 工作的正确方法。

非常感谢您的帮助!

附加信息

我正在使用 Django 框架开发 Web 应用程序。 $("#datepicker").datepicker() 在我不使用 jstree 的视图中工作正常,所以根据我读过的内容,我很确定这是两个插件之间的冲突,很可能与 jQuery 版本有关。

【问题讨论】:

  • 为什么需要 2 个版本的 jquery?
  • getScript 函数不能确保库绑定到正确的版本。它只在 dom 中添加和加载脚本。
  • 我实际上不需要它,但我在 jquery-ui/external/jquery.js 中找到了 jQuery 1.12.4 文件,所以我认为它是插件使用的版本。我也尝试删除它或用我的 jquery 3.x 文件替换它,但它没有解决问题。

标签: javascript jquery jquery-ui jquery-ui-datepicker


【解决方案1】:

你说 “使用 jQuery 1.12.4 的 jQueryUI v1.12.1”。您是根据什么决定这个要求的?

http://jqueryui.com/download/ 仅列出 UI 1.12.1 的下载,如下所示:

1.12.1(稳定,适用于 jQuery1.7+)需要 jquery 1.7 或更高版本。

为了佐证,http://api.jqueryui.com/ 说得很清楚

jQuery UI 1.12 支持 jQuery 1.7 和更新版本。

除了最低要求外,没有提到具体的版本。没有理由不能使用 3.x。正如您所发现的,在您的页面中包含多个版本的 jQuery(甚至是同一版本的多个副本)会带来麻烦。

要解决您的问题,您只需从项目中完全删除 jquery 1.12.4。

【讨论】:

  • 其实我在 jquery-ui/external/jquery.js 中找到了 jQuery 1.12.4 文件,我尝试将其删除并替换为 3.x 文件。同样在遇到这个问题之前,我没有在我的脚本声明中包含 old-jquery.js。
  • 是的,但这正是它的包装方式。正如文档明确指出的那样,您不需要使用该版本。你说“我试图删除它并用 3.x 文件替换它。”......好吧不要。不要用任何东西代替它。只需使用您的 Syc/js/jquery.js(我假设它包含版本 3.1.1?)并在整个页面中使用它一次。正如我上面提到的,不要加载多个副本,即使它们是相同的版本。一旦你确认只有一个 jQuery 副本被加载到页面中,那么如果你仍然有问题,我们可以再次详细查看它
  • 好吧,这正是我最初所做的(你是对的 Syc/js/jquery.js 是 3.1.1),但后来我得到了 TypeError "datepicker is not a function" .正如您在附加信息中看到的那样,它只发生在我同时拥有 jstree 和 jquery-ui 的模板中。我删除了 jquery-old.js 导入并将 jquery-ui 文件夹恢复到其原始状态,但无法使其正常工作。
  • 顺便说一句,如果这有帮助的话,其他 jquery-ui 工具(例如对话框)在此视图中可以正常工作。
  • 在您运行 .datepicker 命令之前 是否存在元素 $('#datepicker')?在运行 .datepicker 命令之前是否会加载 jquery-ui 文件?如果您暂时从这些模板中删除 jstree,datepicker 是否有效?
【解决方案2】:

看看jQuery-migrate

它恢复了在较新版本的 jQuery 中删除的 API。

在你的网页中,在 jQuery 的 script 标签之后加载插件,例如:

<script src="https://code.jquery.com/jquery-3.0.0.js"></script>
<script src="https://code.jquery.com/jquery-migrate-3.0.1.js"></script>

查看 GitHub 上的 documentation 了解更多信息。

希望这会有所帮助!

【讨论】:

  • 这不是必需的。正如网站上明确说明的那样,jQuery UI 可以很好地与较新的 jQuery 配合使用。 OP 遇到的问题是由于页面上同时有 2 个版本而发生冲突。
  • 我宁愿不使用更多的外部插件,我想我可以用更“正确的方式”解决这个问题。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多