`

终极解决jQuery与$冲突

阅读更多

我们公司用的是jQuery1.4.2,还有jQuery1.3.2,还有可能要用1.2或者1.1的。至于要用这么多版本完全是因为插件是基于某个版本开发的。如果统一用一个版本的框架,会导致插件运行不正确。此外还用了prototype1.6.2,用prototype是因为click框架自带的。这样冲突就十分严重了,首先$就有prototype和jQuery的冲突,而且还有高端冲突即jQuery各版本之间对于jQuery引用的冲突。
(1)首先解决$的冲突,由于项目的click框架是用了jQuery1.3.2和prototype,并且可能要随Apache更新(意味着改了也是白改),而且改动jQuery1.3.2量大,因为很多插件是基于jQuery1.3.2的,并且有可能基于jQuery1.3.2的插件代码是用Java生成的(这无法改,因为源代码是jar包的)。因此考虑去掉prototype的$引用,改动量少(测试不通过)


第一步:找到prototype.js源代码,将function $(element) {。。。},修改成function $p6(element) {。。。}这将废弃原来的$命名空间,将其换成$p6。同时在后面加上两句var _temp$ = window.$;window.$=$p6;。这两句是为了保证prototype.js的里面引用了$的源代码能够正常使用,同时将别的框架的$引用暂存到临时变量空间中去。把这一句window.$ = _temp$;(返还$的控制权限给jQuery)放在文件的末尾会报错,不知道为什么,估计是prototype.js程序运行到最后,这个程序并没有结束,还要回到前面的代码去执行,而前面的代码还要用$,如果返还给jQuery了,当然就报错了。本人没用过prototype,只能这样猜测。


第二步:在基于prototype.js框架的所有插件
头部加上以下代码
var _temp$ = window.$;//将jQuery1.3.2的$放到临时的变量空间上
window.$=$p6;//将prototype新的命名空间$j6赋予给$,这样做的目的是保持中间的原始代码对于$的引用不用改动,也就是不用改动中间原始的插件代码,同时又不会引用到jQuery1.3.2的$。

【中间的原始代码不动】

尾部加以下代码
window.$ = _temp$;//将$的引用权限返还给jQuery1.3.

 

第三步:以后要用基于prototype的选取函数就只能用$p6(element)了。

 但是按照以上这种方式将prototype放弃$的做法,不知道为什么不可以。网上百度的资料也全是jQuery放弃$的控制权,不知道为什么?期待牛人解答。但是以下的(2)是本人测试过行的通的。至于jQuery放弃$控制权网上文章一大堆。大概就是两种情况(一)jQuery.js放在prototype.js前面,这个时候jQuery只能用jQuery来进行引用,prototype写的代码无需任何改动。(二)jQuery.js放在prototype.js后面,由于jQuery在后,默认它的$命名会覆盖掉prototype定义的$,因此需要多这么一句jQuery.noConflict();。它的意思就是释放它定义的$命名,并还原以前的$定义即prototype定义的$。

 

 

(2)再来解决jQuery1.3.2和1.4.2的冲突。(测试通过)


第一步:在1.4.2的源代码的最后加上一句 var $j4 = jQuery.noConflict(true);//之所以在源码这里加,而不是像大多数文章提的在要用到的时候加,这是因为很多基于1.4.2的插件都要加,在这里加可以避免过多插件加这句代码导致重复。这一句是将1.4.2的jQuery和$的引用权限全部放弃。也就是基于1.4.2的插件不能再用jQuery和$了。同时给予$j4的新的命名空间,注意它是window的属性。看1.4.2的源代码会发现它其实也就执行了这两句:window.$=_$;window.jQuery=_jQuery,道理同window.$=_temp$(返还命名空间)只是命名不同而已。


第二步:在基于1.4.2的框架的所有插件


头部加上以下代码
var _temp$ = window.$,_tempjQuery = window.jQuery;/将jQuery1.3.2的$和jQuery放到临时的变量空间上
    window.$ = $j4;//这句和下面的那句都是为了给中间的代码能够正确使用jQuery和$用的。后面的$j4是赋予他们正确的引用。
    window.jQuery = $j4;
之所以要先放临时变量存储,有三点必须这样做的理由:

a:我们不希望改动大量的jQuery插件源代码,最好是不动,即使改的话,尽量改的少。而在头部尾部加改动代码,中间的原始代码不动也是不错的一种方式。

b:因为1.4.2的已经放弃了jQuery和$的控制权,但是已有的插件代码又用了他们来做引用,因为插件不可能预知冲突,即使有冲突他人开发的插件也一定要用$或者jQuery引用,除非它不是jQuery下的插件。

c:为了防止插件里面直接用window.$和window.jQuery进行引用从而导致引用到1.3.2的jQuery和$,虽然这种情况比较少,但是以防万一。

【中间的原始代码不动】

尾部加以下代码
window.$ = _temp$;//将$的引用权限返还给jQuery1.3.
window.jQuery = _tempjQuery;//将jQuery的引用权限返还给jQuery1.3.

 

第三步:以后要用基于jQuery1.4.2的选取函数就只能用$j4(element)了。


总结:到目前为止可行方案:jQuery1.4.2完全放弃$和jQuery的控制权限。1.3.2放弃$的控制权限但不放弃j
Query的权限,其实jQuery也可放弃,只不过要给个别名$j3。prototype最好放在jQuery1.3.2后面,它获得$的控制权限。只是以后
要用jQuery1.4.2就必须用$j4来引用了。但这样即使有再多的jQuery框架版本冲突问题,也全部解决掉了。假如来了个1.2的jQuery怎么办,参照(2)的执行步骤,只不过第一步改为var $j2 = jQuery.noConflict(true);第三步用$j2(element)罢了。道理都是相同的。

 

没有解决的问题:如果prototype的版本之间有$冲突怎么办呢?本人没学过prototype,不清楚它的解决方案。本来我以为按照jQuery解决冲突的方案是完全可以的,但是测试结果发现不行。坐等高人降临。

 

 

【本文JavaEye原创,转载请申明出处】

分享到:
评论

相关推荐

    解决jquery与dwr冲突(java/jsp)

    ### 解决jQuery与DWR冲突的方法 在Web开发过程中,经常需要使用多种JavaScript库来实现丰富的前端交互效果。其中,jQuery因其简洁易用的特点而被广泛采用,而DWR(Direct Web Remoting)则是一种简化Java与...

    jquery解决冲突

    jquery解决冲突jquery解决冲突jquery解决冲突jquery解决冲突jquery解决冲突jquery解决冲突jquery解决冲突jquery解决冲突

    解决jquery与dwr的$符号冲突

    jquery与dwr两个ajax包因为$符号会冲突。 如果是通过jar包引入的dwr资源,修改$符号会有一些不便。 下载的jar包是基于dwr2.0.2修改,使用dwr的时候使用“D$”即可,解决了和jquery的“$”符号冲突的问题。

    加载jQuery后$冲突的解决办法

    然而,由于jQuery同样使用美元符号($)作为其快捷方式,这会导致与原有使用$作为变量名的JavaScript代码发生冲突。当项目中引入jQuery后,原先的$调用可能会被覆盖,造成原有代码无法正常工作。这个问题被称为“$...

    [重新上传]解决jquery与dwr的$符号冲突

    jquery与dwr两个ajax包因为$符号会冲突。 如果是通过jar包引入的dwr资源,修改$符号会有一些不便。 下载的jar包是基于dwr2.0.2修改,使用dwr的时候使用“D$”即可,解决了和jquery的“$”符号冲突的问题。

    Jquery中$与$.fn的区别实例.zip

    在jQuery库中,`$`和`$.fn`都是核心组成部分,但它们有着不同的用途和功能。...通过实践和探索`Jquery中$与$.fn的区别实例`中的示例,你将能深入理解这两个核心组件的用法和它们在实际项目中的应用。

    ecshop解决与jQuery冲突文件

    新的`transport.js`应该已经解决了与jQuery的冲突问题,采用了更友好的命名空间或者避免了与jQuery相同的方法名。替换后,ECSHOP将能更好地与jQuery库协同工作,避免冲突,同时保持原有的AJAX功能。 在实际操作中,...

    ecshop解决jquery冲突js

    标题中的"ecshop解决jquery冲突js"就直指这个问题,即如何在ECShop环境中解决JQuery与其他JS库的冲突。 JQuery冲突通常源于$符号的全局使用,这是JQuery的核心选择器和函数调用。为了解决这个问题,JQuery提供了`...

    JQuery的$命名冲突详细解析

    在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$(‘#msg’)等同于JQuery(‘#msg’)的写法。然而,当我们引入多个js库后,在另外一个js库中也定义了$符号的话,那么我们在使用$符号时就...

    jQuery $命名冲突解决方案汇总

    于是找资料,原来是jquery命名冲突了。因为许多JavaScript 库使用$作为函数或变量名,jquery也一样。其实$只是jquery的一个别名而已,假如我们需要使用jquery 之外的另一js库,我们可以通过调用 $.noConflict() 向该...

    如何解决vue与传统jquery插件冲突

    本文将探讨如何解决Vue与传统jQuery插件之间的冲突,以确保两者能够和平共处。 首先,冲突主要源于Vue.js的数据绑定机制与jQuery直接操作DOM的方式不同。Vue采用声明式的数据绑定,通过监听数据变化来更新视图,而...

    如何解决Jquery库及其他库之间的$命名冲突

    以上方法可以帮助解决jQuery与其他JavaScript库之间的$冲突问题。在实际开发中,开发者可以灵活选择适合当前项目的解决方案。需要注意的是,选择解决方案时,也要考虑到项目的维护性与代码的可读性。如果在特定项目...

    完美解决jQuery符号$与其他javascript 库、框架冲突的问题

    总的来说,通过合理使用`noConflict`方法,开发者能够有效地解决jQuery与其他JavaScript库、框架之间的符号冲突问题,保证代码的稳定性和兼容性。在实际开发中,应该根据项目的具体情况选择适合的解决策略,确保各个...

    ecshop和jquery冲突的解决方法

    在本篇文章中,我们将深入探讨如何有效解决ecshop与jQuery之间的冲突问题,并提供一系列实用的解决方案,帮助开发者更好地处理这两种技术共存时可能遇到的问题。 ### 一、Ecshop简介 Ecshop是一款开源的电子商务...

    jQuery解决$符号命名冲突

    这样,在任何地方使用$符号调用时,实际上是在调用jQuery对象,从而解决了冲突。但这种方法也带来了不便,因为这需要开发者记住在任何使用$符号的地方都需要用jQuery替换,这无疑增加了维护的难度。 第二种方法是...

    导入extjs、jquery 文件时$使用冲突问题解决方法

    总的来说,解决jQuery与ExtJS或其他使用`$`的库之间的冲突,关键在于利用jQuery的`noConflict`方法释放`$`的使用权,并使用替代变量来调用jQuery的方法。这样既能保留两个库的功能,又避免了命名冲突,确保了代码的...

    jQuery的$.each()遍历数组或对象的用法

    $.each()遍历数组或对象的具体用法

Global site tag (gtag.js) - Google Analytics