在JSP中使用<jsp:include page="somethingPage.jsp"></jsp>来嵌套页面的时候,会出现jQuery之间的冲突
解决办法:
在需要嵌套的页面中有jQuery引入冲突问题的地方做如下处理:
var $jq = jQuery.noConflict(); $jq(document).ready(function(){ $jq("select").sSelect(); });
在这个示例中,使用$jq来代替,即可解决冲突的问题。
原理:
由于jQuery以及 prototype.js,coypSelect.js都使用了美元符函数“$”作为选择器,在两者混合使用的时候$函数被重复定义了,结果导致其中一个框架不能使用。
方法一:
<script src="http://jquery.com/src/latest/"></script> <script type="text/javascript"> JQ = $; //rename $ function </script> <script src="prototype.js"></script>
这样一来,可以使用JQ来代替jQuery里的$函数名,而prototype的$函数照常使用,像这样:
<script type="text/javascript"> JQ(document).ready(function(){ JQ("#test_jquery").html("this is jquery"); $("test_prototype").innerHTML="this is prototype"; }); </script>
方法二——推荐方法(闭包法)
尽管这种办法在一定程度上解决了两者的冲突,但作为jQuery的死忠,我是万分不情愿改写$为JQ或其他替代的字符。反之Prototype的粉丝估计也会这样想。那么,是不是有另一种解决方案,让两种框架能和谐共处呢?现在流行和谐嘛!
<script type="text/javascript" src="jquery-1.2.6.js"></script> <script type="text/javascript" src="prototype-1.6.0.2.js"></script> <div id="test_jquery"></div> <div id="test_prototype"></div> <script type="text/javascript"> <!-- (function($){ $(document).ready(function(){ alert($("#test_jquery").html("this is jqeury")); }); })(jQuery); $("test_prototype").innerHTML="this is prototype"; //--> </script>
经测试,jQuery与Prototpye工作均正常。唯一以往常不一样的是,我们要在以前写的Jquery外面加多一个外套:
(function($){ //这里写Jquery代码 })(jQuery);
这个外套巧妙地利用函数局部变量的有效范围保证你可以安心地按原来的方式写Jquery代码
方法三: jQuery库在其他库之前导入,直接使用jQuery(callback)方法如:
<!--先导入jQuery --> <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script> <!--后导入其他库 --> <script src="prototype-1.6.0.3.js" type="text/javascript"></script> </head> <body> <p id="pp">test---prototype</p> <p >test---jQuery</p> <script type="text/javascript"> jQuery(function(){ //直接使用 jQuery ,没有必要调用"jQuery.noConflict()"函数。 jQuery("p").click(function(){ alert( jQuery(this).text() ); }); }); $("pp").style.display = 'none'; //使用prototype </script>
方法四: jQuery库在其他库之后导入,使用jQuery.noConflict()方法将变量$的控制权让渡给其他库,有以下几种方式:
script type="text/javascript"> jQuery.noConflict(); //将变量$的控制权让渡给prototype.js jQuery(function(){ //使用jQuery jQuery("p").click(function(){ alert( jQuery(this).text() ); }); }); $("pp").style.display = 'none'; //使用prototype </script> //代码二 <script type="text/javascript"> var $j = jQuery.noConflict(); //自定义一个比较短快捷方式 $j(function(){ //使用jQuery $j("p").click(function(){ alert( $j(this).text() ); }); }); $("pp").style.display = 'none'; //使用prototype </script> //代码三 <script type="text/javascript"> jQuery.noConflict(); //将变量$的控制权让渡给prototype.js jQuery(function($){ //使用jQuery $("p").click(function(){ //继续使用 $ 方法 alert( $(this).text() ); }); }); $("pp").style.display = 'none'; //使用prototype </script> //代码四 <script type="text/javascript"> jQuery.noConflict(); //将变量$的控制权让渡给prototype.js (function($){ //定义匿名函数并设置形参为$ $(function(){ //匿名函数内部的$均为jQuery $("p").click(function(){ //继续使用 $ 方法 alert($(this).text()); }); }); })(jQuery); //执行匿名函数且传递实参jQuery $("pp").style.display = 'none'; //使用prototype </script>