JQuery插件引入顺序异常致myCart报错 多插件功能失效问题求助
问题根因定位
- 核心问题是全局jQuery被重复加载多次,实例互相覆盖:
当前脚本列表里一共加载了6份jQuery文件,分别是cdnjs的2.2.4版本、code.jquery.com的同版本、Owl轮播目录自带的jquery.js、Owl轮播目录的jquery-min.js、产品画廊目录自带的jquery.js。每次加载jQuery都会重写全局window.$和window.jQuery变量,导致不同插件绑定的方法根本不在同一个jQuery实例上。 - 对应报错逻辑:
myCart方法是在加载jquery.mycart.js时,绑定到当时生效的那个jQuery实例上的。等后面又加载新的jQuery文件时,全局$被替换成全新的、没有任何插件方法的实例,之前绑定的.myCart()、.zoom()、数字spinner方法全部丢失,自然抛出$(...).xxx is not a function的错误。 - 之前调整位置时出现“换个位置就有功能正常、有功能失效”的原因:不管把jQuery挪到页面顶部还是底部,只要后面跟着的本地路径脚本里还有重复的jQuery文件,就一定会覆盖全局实例,导致先加载的插件方法失效。
解决方案
- 第一步:彻底删除所有重复的jQuery引入,全页面仅保留1份jQuery加载,删掉的文件包括:
https://code.jquery.com/jquery-2.2.4.min.js(和已引入的cdnjs版本完全重复)../product landing page/owl carousel/jquery.js../product landing page/owl carousel/jquery-min.js../product landing page/product_gallery/jquery.js
- 第二步:严格按照依赖顺序排列所有脚本,不能乱序:
- 最靠前的位置放唯一保留的jQuery文件,确保后续所有依赖jQuery的库、插件都能拿到同一个全局实例
- 紧接着放基础UI库的脚本,比如Bootstrap 3的js文件,它必须在jQuery加载完成后才能初始化
- 再往后依次放所有基于jQuery开发的插件,分别是加购插件、轮播插件、画廊插件、数字spinner插件
- 最后放不依赖jQuery的原生JS脚本(比如Vanilla JS写的modal功能)
- 调整完成后的参考脚本结构:
<!-- 全局唯一jQuery实例,放在所有依赖脚本最前面 --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <!-- Bootstrap基础依赖 --> <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script> <!-- 加购插件 --> <script src="../Jquery-cart-add/jquery.mycart.js"></script> <script src="../Jquery-cart-add/cart.js"></script> <!-- 轮播插件 --> <script src="../product landing page/owl carousel/owl.carousel.min.js"></script> <!-- 产品画廊插件 --> <script src="../product landing page/product_gallery/zoom.js"></script> <script src="../product landing page/product_gallery/script.js"></script> <!-- 数字spinner插件 --> <script src="../product landing page/number spinner/jquery.nice-number.js"></script> <script src="../product landing page/number spinner/jquery-number.js"></script> <!-- 原生JS模态框脚本,无jQuery依赖 --> <script src="../product landing page/modal.js"></script> </body>
- 兜底方案:如果部分本地插件必须加载同目录下自带的jQuery文件,不要直接删掉,而是在加载完自带jQuery后调用
$.noConflict(true)释放全局变量,再把插件绑定的方法迁移到全局保留的jQuery实例上,避免互相覆盖。
内容的提问来源于stack exchange,提问作者dick dastardly
相关产品推荐
相关产品推荐

