【问题标题】:jQuery No Conflict Still Conflicts with Other Version of jQueryjQuery No Conflict 仍然与其他版本的 jQuery 冲突
【发布时间】:2012-04-12 20:26:05
【问题描述】:

我正在尝试将双滑块插件与 estalge 视图框一起运行。它们都使用 jQuery,并且单独工作,但是当我将它们放在一起时,一个中断。我曾尝试实施 jQuery 无冲突规则,但我认为我可能在某处遗漏了一个小细节。到目前为止,我的编码看起来像:

<script src="scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="scripts/jquery.easing.1.3.js" type="text/javascript"></script>
<script src="scripts/jquery.timers-1.2.js" type="text/javascript"></script>
<script src="scripts/jquery.dualSlider.0.3.js" type="text/javascript"></script>
<!-- START ESTALGE -->
<script src="js/jquery-1.6.2.min.js"></script>
<script src="js/jquery.etalage.min.js"></script>

<script type="text/javascript"> 

  $.noConflict();
  jQuery(document).ready(function($) {
                jQuery('#etalage').etalage();
            });

    $(".carousel").dualSlider({
                auto:true,
                autoDelay: 6000,
                easingCarousel: "swing",
                easingDetails: "easeOutBack",
                durationCarousel: 1000,
                durationDetails: 500

            });

    </script>

任何帮助将不胜感激。谢谢你

【问题讨论】:

  • noConflict 是为了阻止 jQuery 干扰其他库,而不是它自己。换句话说,除非你愿意使用 jQuery 的一个版本并坚持下去,否则我认为你很不走运。
  • @Corbin:你可以有多个版本的 jQuery,$.noConflict 会从第二个返回 jQuery 函数。
  • @Corbin 这根本不是真的。 noConflict 可以并且将防止 jQuery 与自身的另一个副本发生冲突。
  • @Corbin 五分钟前我也有同样的想法,但后来我得到了纠正。支持多个版本;但是,插件兼容性取决于插件是否经过精心设计,使用经典的function($){}(jQuery) IIFE 公式。
  • 那么我非常正确:)。

标签: jquery conflict


【解决方案1】:

您错误地使用了noConflict

<script src="scripts/jquery-1.3.2.min.js" type="text/javascript"></script>

<!-- INCLUDE ANY SCRIPTS HERE THAT RELY ON 1.3.2 -->

<script type="text/javascript"> 
    // HERE WE CAN USE 1.3.2

    // re-assign 1.3.2 to a new variable so we can use it later
    var $jq132 = $.noConflict();
</script>

<script src="js/jquery-1.6.2.min.js"></script>

<script type="text/javascript"> 

    // $ is now 1.6.2 and $jq132 is 1.3.2, both can be used.

</script>

【讨论】:

  • 我建议也使用 $.noConflict(true) 来确保全局 jQuery 变量也被还原,尽管它可能不是强制性的。
  • @KevinB 以这种方式布局实际上并不重要。如果按照@Rocket 的方式完成,那么根据您是否通过 true,您将获得两种不同的结果。在我的回答中,1.6 将始终声称jQuery
  • 这是正确答案;唯一可能的问题是 1.3.2 插件之一没有正确关闭 jQuery 对象,并尝试访问其处理程序中的全局 $ 对象。不幸的是,特别是对于那些旧的插件,这比它应该的更可能。不过,@JamesMontagne 是正确的。
【解决方案2】:

您可以有多个 jQuery 版本,$.noConflict 将返回您的 jQuery 对象。您需要将其另存为另一个变量。

<script src="scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="js/jquery-1.6.2.min.js"></script>
<script>
    $jq = $.noConflict();
    // $jq is jQuery 1.6.2
    // $ is jQuery 1.3.2
</script>

演示:http://jsbin.com/uhazan/3/edit#javascript,html,live

注意:jQuery 变量将设置为 1.6.2(第二个),如果您希望它为 1.3.2(第一个),请将 true 传递给 $.noConflict

附:您可能希望将您的$(".carousel").dualSlider 放入$(document).ready(

【讨论】:

  • 不幸的是,这种技术不能可靠地与插件一起使用,这就是他首先包含旧版本的 jQuery 的原因。插件期望 jQuery 在某个全局可用。
【解决方案3】:

尝试将您的slider 放入jQuery(document).ready(function($) {});

来自所有者site

Etalage 是否支持 jQuery 无冲突模式?

插件本身没有冲突准备。只需将"$" 替换为您启动插件的"jQuery",如下所示:

jQuery(document).ready(function(){
    jQuery('#etalage').etalage();
});

【讨论】:

  • 只要jQuery 指向正确的版本。在 OP 的示例中,jQuery 将是 1.6.2。
【解决方案4】:

你不需要两个 jQuery Core Lib 包含

试试这个:

<script src="scripts/jquery-1.6.2.min.js" type="text/javascript"></script>
<script src="scripts/jquery.easing.1.3.js" type="text/javascript"></script>
<script src="scripts/jquery.timers-1.2.js" type="text/javascript"></script>
<script src="scripts/jquery.dualSlider.0.3.js" type="text/javascript"></script>
<!-- START ESTALGE -->
<script src="js/jquery.etalage.min.js" type="text/javascript"></script>

<script type="text/javascript"> 

 jQuery(document).ready(function($) {

 jQuery('#etalage').etalage();
 jQuery(".carousel").dualSlider({
            auto:true,
            autoDelay: 6000,
            easingCarousel: "swing",
            easingDetails: "easeOutBack",
            durationCarousel: 1000,
            durationDetails: 500

        });
});
</script>

【讨论】:

  • jquery-1.6.2.min.js中不包含jquery.easing.js吗?
【解决方案5】:

如果你必须使用多个版本的 jquery 然后使用

<script src="scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script>
    var jq132 = jQuery.noConflict();
</script>
<script src="js/jquery-1.6.2.min.js"></script>

现在调用旧版本的 jquery 像

jq132('element').doSomething();

以及较新版本的jquery可能如下

$('element').doSomething();

【讨论】:

  • 不幸的是,这种技术不能可靠地与插件一起使用,这就是他首先包含旧版本的 jQuery 的原因。插件期望 jQuery 在某个全局可用。
【解决方案6】:

$(".carousel").dualSlider({ 行在jQuery(document).ready() 函数之外,我很确定这不是您的意图。目前,这可行:

jQuery.noConflict();
jQuery(document).ready(function($) {
    $('#etalage').etalage();

    $(".carousel").dualSlider({
        auto:true,
        autoDelay: 6000,
        easingCarousel: "swing",
        easingDetails: "easeOutBack",
        durationCarousel: 1000,
        durationDetails: 500
    });
});

但是,您的代码还存在其他问题。您引入了两个版本的 jQuery,其中一个非常旧(1.3.2)。你不会得到好的结果。如果有一些依赖于旧 jQuery 的库,请考虑不使用该库。无论如何,它可能无法在此页面上正常工作,因为该库的任何运行时活动都只能访问 jQuery 1.6。 jQuery .noConflict docs 提到您可以提供布尔值 true 作为 .noConflict 的参数以释放 jQuery 关键字,但是到那时,您加载的插件已经在旧版本附近关闭。

【讨论】:

  • 您最后的粗体陈述并不完全正确。它还使您能够使用多个版本的 jquery。
  • 你可以,但它并不是为此而设计的。尤其是插件,期望 jQuery 至少可以通过 jQuery 全局使用。如果 OP 已经修改了插件来解决这个问题,那很好,但由于意外的影响,一般不推荐使用它。
  • 任何要求jQuery 始终可用的插件都是写得不好的插件。一个好的插件只需要它在插件加载时就已经存在。
  • @zetlen: $.noConflict 旨在管理不同的 jQuery 版本。查看文档:api.jquery.com/jQuery.noConflict 在最后一个示例中,它显示了// Do something with another version of jQuery。我想说它就是为此而设计的。
  • 一个写得好的插件是这样的格式:(function( $ ){})( jQuery ); 只要jQuery 最初存在,插件就会永远引用它。
猜你喜欢
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多