兼容第三方框架 jQuery多库共存机制详解
创始人
2024-07-17 07:40:42
0

在Web项目开发中,经常需要引用第三方JavaScript库,如果第三方JavaScript库与自已的JavaScript库使用相同的全局变量,是一个比较麻烦的事。程序员多半可能会修改其中一方的JavaScript代码。能不能有一个比较好的方法解决呢?让我们看一下jQuery如何做到的。

jQuery多库共存机制指jQuery库完全兼容第三方库,例如jQuery中使用$做为函数入口,在该页面同时引入另一个库,其中也使用了$做为函数名。因此jQuery与该库发生冲突,例1:

  1.  
  2.  
  3.   
  4.    New Document  
  5.      
  6.      
  7.    
  8.    
  9.   
  10.  
  11.   
  12.   
  13.   
  14.  

在如上示例中 第三方库同时使用了"$"与"jQuery",此时jQuery入口被第三方库覆盖了。jQuery提供了noConflict函数解决冲突,例2:

  1.  
  2.  
  3.   
  4.    New Document  
  5.      
  6.   
  7.      
  8.    
  9.    
  10.   
  11.  
  12.   
  13.   
  14.   
  15.  

noConflict重新将jQuery入口指针指向$1,此时可以用$1访问jQuery库,其中兼容代码要写在第三方库载入之前(如果写在之后,jQuery的$和jQuery入口被第三方库覆盖了,无法调用兼容代码)。

在实际应用中,如果jQuery载入位置在第三方库之后,jQuery会覆盖第三方JavaScript库么?如下代码,例3:

  1.  
  2.  
  3.   
  4.    New Document  
  5.      
  6.    
  7.    
  8.        
  9.   
  10.  
  11.   
  12.   
  13.   
  14.  

此处jQuery加载完毕已经将第三方库覆盖了。如果想调用第三方库,似乎有点困难。当然jQuery已经提供了解决方法,例4:

  1.  
  2.  
  3.   
  4.    New Document  
  5.      
  6.    
  7.    
  8.        
  9.   
  10.   
  11.  
  12.   
  13.   
  14.   
  15.  

例4中同样在jQuery载入之后调用"兼容代码",和例2兼容代码相同,但意义上有差别.在例2中第三方库覆盖了jQuery,其中兼容代码的作用在第三方库覆盖jQuery前,jQuery入口指针赋给"$1".在例4中与上相反,由于jquery库在载入完成时,已经将第三方库覆盖了,此时"$"指向jQuery库,兼容代码作用是将"$"重新指向第三方库.同时充许重新定义jQuery入口.

jQuery兼容机制实现原理(示例代码以jQuery-1.4.3为例):

  1. //29-32行  
  2. // Map over jQuery in case of overwrite  
  3. _jQuery = window.jQuery,  
  4.  
  5. // Map over the $ in case of overwrite  
  6. _$ = window.$,  
  7.    
  8. //394-402行  
  9.  noConflict: function( deep ) {  
  10.   window.$ = _$;  
  11.  
  12.   if ( deep ) {  
  13.    window.jQuery = _jQuery;  
  14.   }  
  15.  
  16.   return jQuery;  
  17.  }, 

其中29-32行,jQuery执行前,将window.$,window.jQuery值保存到_$和_jQuery中(此时函数指针"jQuery","$"可能指向第三方库,此处为兼容处理做准备)。

394-402行将jQuery和$重新赋给window.$,window.jQuery,同时返回jQuery函数指针.  不难看出调用noConflict函数后,被jQuery"占用"的$与"jQuery"又交还给第三方库了。

【编辑推荐】

  1. jQuery的运行机制和设计理念
  2. jQuery开发者:你真的需要一个插件吗?
  3. jQuery让开发者恋恋不舍的秘密
  4. jQuery最佳实践:精妙的自定义事件
  5. jQuery应用程序性能指标和调优

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...