注意:这与两个不同版本的jQuery是不同的问题(这里提到的:我可以在同一页面上使用多个版本的jQuery吗?(。不同之处在于,这是两个版本号相同的jQuery副本,但外部源加载了不同的包含库,这意味着使用jquery调用的两个不同版本的正常解决方案不起作用。
我在同一网站上有两个不同的jquery变体,由不同的来源加载。
一,当通过一条路径运行时,当我运行console.log(jQuery.fn.jquery);
时:
3.4.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector
另一条路径返回
3.4.1
但是,两者都在系统上,路径主要影响加载顺序。问题变得更糟的是,以前的苗条版本似乎是加载时默认的版本,并且在我的应用程序外部加载。
所以问题是...一个缺少 Ajax,另一个没有,并且通过一条路径,Ajax 版本不起作用,因为 jquery 认为没有这样的函数。如何告诉它检查其他jquery 文件?
离开评论...
您可以使用立即调用的函数表达式 (IIFE( 来限定逻辑范围,也可以使用noConflict
调用来解决此问题。 假设您有如下所示的内容。
<script src="locationOfNormalJQuery"></script> <!-- included by you -->
...html...
<script src="locationOfSlimJQuery"></script> <!-- included by app out of your control -->
<script>
...your logic...
</script>
"你的逻辑"只能访问第二个包含中包含的jQuery
,因为每个jQuery包含都替换了全局window.jQuery
和window.$
引用。 这可以通过两种可能的方式进行更改。
noConflict
<script src="locationOfNormalJQuery"></script> <!-- included by you -->
<script>
window.jQueryWithAjax = jQuery.noConflict();
</script>
...html...
<script src="locationOfSlimJQuery"></script> <!-- included by app out of your control -->
<script>
jQueryWithAjax.find(<whatever>);
</script>
IIFE方法
<script src="locationOfNormalJQuery"></script> <!-- included by you -->
<script>
(function($){
$(<whatever>);
}(jQuery));
</script>
...html...
<script src="locationOfSlimJQuery"></script> <!-- included by app out of your control -->
noConflict
方法将以前版本的 jQuery 保存到一个辅助变量中,供以后使用。 IIFE 方法在第二个脚本包含发生之前移动逻辑,并将当前jQuery
传递给它。 此时,IIFE 中的所有逻辑都将使用该$
作为传入的版本,而不管它以后在window
上如何更改。
想出了一个可能的解决方案:
由于后来加载的jQuery版本覆盖了早期版本的jQuery,我可以使用javascript通过jQuery.fn.jquery
进行持续检查,并受到@Taplar解决方案的启发,以及对另一个问题的回答:监听JavaScript中的变量变化
我向window.jQuery
和window.$
添加侦听器
在更改时,我检查jQuery.fn.jquery
的结果,如果它与我想要的不同,我会用我想要的版本重新加载 jquery。(如果有人在我弄清楚之前发布了有关如何执行此操作的代码,他们会得到复选标记(。