Discuz教程网

[二次开发] Discuz X2.5与jQuery的$冲突解决方法

[复制链接]
authicon dly 发表于 2012-10-6 19:32:05 | 显示全部楼层 |阅读模式
方法一:
jquery对浏览器兼容和实现某些功能非常方便,大家经常使用,jquery中的$()函数与dx冲突,你引用jquery则dx中的部分js就报错了。看了看dx中这样定义:

  1. function $(id) {return document.getElementById(id);
  2. }
复制代码


jquery和prototype的$的冲突,尝试上面的方法都是测试有问题,后来根据下面方法测试通过:1、将jquery.js放到prototype.js前面(这个是必须的!)。
2、在jquery.js后面将$变量重命名。
方法如下:
  1. <script type="text/javascript"  src="jquery.js"></script>
  2. <script type="text/javascript">
  3. var jQuery=$;
  4. </script>

  5. <script type="text/javascript" type="text/javascript" src="window.js"></script>
  6. <!--上面这个window.js调用了jquery框架的方法-->
  7. <script type="text/javascript" type="text/javascript" src="prototype.js"></script>
复制代码

3、将原来使用的$方法名一律替换为jQuery名,如$("obj")替换为jQuery("obj")。
例如下面的一段代码, 混合了 jQuery和基于Prototype的 EasyValidation:
  1. <script src="easy_validation/lib/effects.js" type="text/javascript"></script><script src="easy_validation/src/validation_cn.js" type="text/javascript"></script><link rel="stylesheet" type="text/css" href="easy_validation/styles/style_min.css" /><div id="contents"></div><script>jQuery(document).ready(function(){//jQuery("#contents").load("test.jsp");jQuery("#contents").load("test.jsp?username=BeanSoft")});</script><!-- 为form增加required-validate class,标识需要验证form --><form id='helloworld' action="#" class='required-validate'><input name="user.name" class="required min-length-6 max-length-20 validate-alphanum" value="beansoft">*密码:<input name="user.password" type="password" class="required min-length-6 max-length-20" value="123456" >*密码(重复):<input name="password1" type="password" class="required equals-user.password" value="123456" ><input type='submit' value='Submit'/><input type='reset' value='Reset'/></form>
复制代码

方法二:

修改你用jquey实现的js文件,找到除去参数、变量前缀的 $, 例如需要替换的内容为: $. $( 这些类型,直接将 $ 换成 jQuery , 记住,是将你写的或者找到的jq文件中的,和上述类型一样的 $ 统统换成 jQuery,下一步: 在你引用所有jquery文件(jquery-1.2.4b.js和common.js)的时候, 按如下方法写:

  1. <script src=”/static/js/jquery-1.2.4b.js” type=”text/javascript”></script>
  2. <script src=”/static/js/common.js” type=”text/javascript”></script>
  3. <script type=”text/javascript”>
  4. 调用的jquery代码(当中涉及和上述 $有关的,也需要替换成jQuery!!!)
  5. </script>
  6. <script type=”text/javascript”> //这里很重要,必须写的!
  7. jQuery.noConflict();
  8. </script>
复制代码

方法三:
解决方法1:
将jquery.js在common.js之前载入,不然jquery的$()函数会覆盖common.js的$()函数;然后用到jQuery的$()函数的地方都用jQuery()代替。
解决方法2:
将jquery.js在common.js之后载入,在调用jQuery的函数前使用一下代码:
var $$ = jQuery.noConflict();
然后使用$$()或jQuery()来代替jQuery原来的$()函数

方法四:
1.替换选择器函数
将原程序中的:
  1. function $(id) {
  2. return document.getElementById(id);
  3. }
复制代码

替换为:
  1. function $(id) {
  2. if (typeof jQuery == 'undefined' || (typeof id == 'string' && document.getElementById(id))) {

  3. return document.getElementById(id);
  4. } else if (typeof id == 'object' || !/^\w*$/.exec(id) ||
  5. /^(body|div|span|a|input|textarea|button|img|ul|li|ol|table|tr|th|td)$/.exec(id)){
  6. return jQuery(id);
  7. }
  8. return null;
  9. }
复制代码

做一个兼容,对于以前直接用字符串ID的调用依旧使用document.getElementById(id)去获取DOM对象;而如果传入的ID是对象,或者里面有特殊符号(如 # . : ^ 等 jQuery 选择器符号)或者是常用的html标签,就使用jQuery选择器去获取jQuery对象。
2.需要先加载jquery的库,然后加载声明这个兼容的 $ 函数的js文件,以覆盖掉jquery的 $ 函数。
  1. <script language="javascript" type="text/javascript" src="source/script_jquery.js"></script>
  2. <script language="javascript" type="text/javascript" src="source/script_common.js"></script>
  3. …………
复制代码

假如有个TAG的ID是'ctrl_with_id',使用 $('ctrl_with_id') 取得的是DOM的对象,使用$('#ctrl_with_id')可取得jQuery对象,互相不会冲突。
如此,原来程序中的 $ 函数依旧工作,而且同时可以使用 $ 作为jQuery的选择器。



方法五:
uchome 程序中 $ 函数与 jquery 冲突的解决办法
1.替换选择器函数
将原程序中的:

  1. function $(id) {

  2. return document.getElementById(id);

  3. }

复制代码

替换为:

  1. function $(id) {

  2. if (typeof jQuery == 'undefined' || (typeof id == 'string' && document.getElementById(id))) {

  3. return document.getElementById(id);

  4. } else if (typeof id == 'object' || !/^\w*$/.exec(id) ||
  5. /^(body|div|span|a|input|textarea|button|img|ul|li|ol|table|tr|th|td)$/.exec(id)){

  6. return jQuery(id);

  7. }

  8. return null;

  9. }
复制代码

做 一个兼容,对于以前直接用字符串ID的调用依旧使用document.getElementById(id)去获取DOM对象;而如果传入的ID是对象, 或者里面有特殊符号(如 # . : ^ 等 jQuery 选择器符号)或者是常用的html标签,就使用jQuery选择器去获取jQuery对象。
游客,如果您要查看本帖隐藏内容请回复



上一篇:Discuz升级到dx后消息列表无法显示
下一篇:Discuz X2.5论坛最近老自动退出的解决方法
authicon 荷叶地汪 发表于 2014-9-28 12:31:18 | 显示全部楼层
这个可要看好好学习下哈!!!!
authicon csacx 发表于 2014-11-14 21:54:44 | 显示全部楼层
这可要好好学习
authicon sdfiu 发表于 2016-3-8 04:45:33 | 显示全部楼层
4874874784784874
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2024-4-29 20:59

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表