`
nianshi
  • 浏览: 416270 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

jquery 多库共存机制

阅读更多

 

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

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

代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< HTML >
 
< HEAD >
  
< TITLE >  New Document  </ TITLE >
    
< script  src  = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"  language  = "javascript" ></ script >
    
< SCRIPT  LANGUAGE ="JavaScript" >
  
<!--
 
// 第三方库
   function  $(str)
  {
  
return  document.getElementById(str) ;
  }

  
function  jQuery(str)
  {
  
return  document.getElementById(str) ;
  }
  
// -->
   </ SCRIPT >
 
</ HEAD >

 
< BODY >
 
< input  type  = "text"  id  = "txt1"  value  = "aa"   />
 
</ BODY >
</ HTML >

 

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

代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< HTML >
 
< HEAD >
  
< TITLE >  New Document  </ TITLE >
    
< script  src  = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"  language  = "javascript" ></ script >
 
< script >
  
// 兼容代码
   var  $ 1   =  $.noConflict();
  $
1 (document).ready( function (){
   alert($
1 ( " #txt1 " ).val())
   alert($(
" txt1 " ).value) ;
  })
 
</ script >
    
< SCRIPT  LANGUAGE ="JavaScript" >
  
<!--
 
// 第三方库
   function  $(str)
  {
  
return  document.getElementById(str) ;
  }

  
function  jQuery(str)
  {
  
return  document.getElementById(str) ;
  }
  
// -->
   </ SCRIPT >
 
</ HEAD >

 
< BODY >
 
< input  type  = "text"  id  = "txt1"  value  = "aa"   />
 
</ BODY >
</ HTML >

 

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

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

代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< HTML >
 
< HEAD >
  
< TITLE >  New Document  </ TITLE >
    
< SCRIPT  LANGUAGE ="JavaScript" >
  
<!--
 
// 第三方库
   function  $(str)
  {
  
return  document.getElementById(str) ;
  }

  
function  jQuery(str)
  {
  
return  document.getElementById(str) ;
  }
  
// -->
   </ SCRIPT >
    
< script  src  = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"  language  = "javascript" ></ script >  
 
</ HEAD >

 
< BODY >
 
< input  type  = "text"  id  = "txt1"  value  = "aa"   />
 
</ BODY >
</ HTML >

 

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

代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< HTML >
 
< HEAD >
  
< TITLE >  New Document  </ TITLE >
    
< SCRIPT  LANGUAGE ="JavaScript" >
  
<!--
 
// 第三方库
   function  $(str)
  {
  
return  document.getElementById(str) ;
  }

  
function  jQuery(str)
  {
  
return  document.getElementById(str) ;
  }
  
// -->
   </ SCRIPT >
    
< script  src  = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"  language  = "javascript" ></ script >  
 
< script >
  
// 兼容代码
   var  $ 1   =  $.noConflict();
  $
1 (document).ready( function (){
   alert($
1 ( " #txt1 " ).val())
   alert($(
" txt1 " ).value) ;
  })
 
</ script >
 
</ HEAD >

 
< BODY >
 
< input  type  = "text"  id  = "txt1"  value  = "aa"   />
 
</ BODY >
</ HTML >

 

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


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

代码
//29-32行
 // Map over jQuery in case of overwrite
 _jQuery = window.jQuery,

 // Map over the $ in case of overwrite
 _$ = window.$,
 
 //394-402行
 noConflict: function( deep ) {
  window.$ = _$;

  if ( deep ) {
   window.jQuery = _jQuery;
  }

  return jQuery;
 },

 

   其中29-32行,jquery执行前,将window.$,window.jQuery值保存到_$和_jQuery中(此时函数指针"jQuery","$"可能指向第三方库,此处为兼容处理做准备).
   394-402 行将_jQuery和_$重新赋给window.$,window.jQuery,同时返回jquery函数指针.  不难看出调用noConflict函数后,被jquery"占用"的$与"jQuery"又交还给第三方库了.

分享到:
评论

相关推荐

    jQuery 参考手册 速查表

    jQuery 3.1 参考手册 jQuery 核心函数 jQuery([sel,[context]]) jQuery(html,[ownerDoc])1.8* jQuery(callback) jQuery.holdReady(hold) jQuery 对象访问 ...多库共存 jQuery.noConflict([ex])

    jQuery 3.1 标准课程第三章 核心方法插件及多库

    jQuery 3.1 标准课程第三章 核心方法插件及多库共存方法的使用

    解决其他js和jquery冲突方法

    在开发过程中,可能还会使用到其他的JS库,比如Prototype,但多库共存时可能会发生冲突。解决这种冲突的方法有多种,以下是其中的一些: 一、 jQuery 库在其他库之前导入,直接使用 jQuery(callback)方法。这是因为...

    JQuery 1.4.1 API Reference 速查手册.chm

    核心 jQuery 核心函数 ...多库共存 jQuery.noConflict([ex]) 属性 属性 attr(name) attr(properties) attr(key, value) attr(key, fn) removeAttr(name) CSS 类 addClass(class | fn) removeClass([class |

    jQuery帮助文档

    多库共存 jQuery.noConflict([extreme]) 属性 属性 attr(name) attr(properties) attr(key, value) attr(key, fn) removeAttr(name) CSS 类 addClass(class) removeClass([class]) toggleClass(class [, ...

    jQuery基本知识思维导图.xmind

    jQuery的基本使用、选择器、效果、样式操作、属性操作、元素操作、尺寸操作、位置操作、以及事件注册、事件处理、事件对象、拷贝对象、多库共存、部分插件的使用

    jquery的全部版本

    9. **jQuery与其他库的兼容性**:jQuery提供了`$.noConflict()`方法来解决与其他JavaScript库的命名冲突问题,保证了多库共存的可能。 10. **移动和触屏支持**:随着移动互联网的发展,jQuery Mobile和jQuery Touch...

    jQuery高级程序设计目录1

    多库共存是一个实际开发中常见的情况,jQuery通过$.noConflict()方法可以释放$符号,允许与其他库如 Prototype 共存。 在第二章,我们关注jQuery的核心机制。"无new构建"意味着可以通过不使用new关键字创建jQuery...

    JQuery源码详细中文注释!

    在JQuery源码中,还特别考虑了多库共存的情况,通过保存和恢复关键字的方式,防止了与其它库产生命名冲突,这体现了JQuery设计的灵活性和周到性。 此外,JQuery通过一系列的函数封装来创建jQuery对象,实际上就是...

    jquery基本语法ppt

    **jQuery基本语法详解** jQuery是一个高效、简洁的JavaScript库,它极大地简化了DOM操作、事件处理、动画设计和...在实际项目中,合理利用jQuery的插件机制和多库共存策略,可以灵活地与其他JavaScript库结合使用。

    JQuery新版中文手册

    多库共存 jQuery.noConflict([ex]) 属性 属性 attr(name|pro|key,val|fn) removeAttr(name) prop(name|pro|key,val|fn)1.6+ removeProp(name)1.6+ CSS 类 addClass(class|fn) removeClass([class|fn]) ...

    jQuery源码+中文详细注解

    ` 用于保存`window`对象上的`jQuery`和`$`变量,这是为了应对多库共存的情况。当用户使用`jQuery.noConflict()`方法时,可以恢复原来保存的`jQuery`和`$`变量,避免了与其他库的关键字冲突。 ##### 3. jQuery对象的...

    web中常用api

    多库共存 jQuery.noConflict([ex]) HTML 5 标准属性 Previous Page Next Page HTML 标签拥有属性。您可以在每个标签的参考页中找到相应的特殊属性。这里列出的属性是通用于每个标签的核心属性和语言属性(有个别例外...

    jQuery 1.4.1 中文参考

    **多库共存** - `jQuery.noConflict()`:释放jQuery的$别名,以允许与其他库一起使用。 - `jQuery.noConflict(extreme)`:更彻底地释放jQuery的命名空间。 **选择器** jQuery提供了多种选择器,包括基本选择器...

    锋利的jQuery_(源码)

    7. **第七章**:讨论了jQuery与其他JavaScript库的共存问题,以及如何在多库环境中有效使用jQuery。 8. **第八章**:涵盖了高级话题,包括性能优化策略、jQuery的最佳实践,以及如何调试jQuery代码,确保代码的高效...

    jquery源码_详细中文注释.pdf

    紧接着,在第56至68行,文档展示了如何处理多库共存的情况。具体做法是: 1. **保存原有的`jQuery`和`$`引用**:通过`var _jQuery = window.jQuery, _$ = window.$;`,将当前窗口中的`jQuery`和`$`变量保存到新的...

    jquery学习

    6. **多库共存**: - `.noConflict([ex])`:释放jQuery的`$`符号,以便与其他库兼容。 7. **属性操作**: - `.attr(name)`:获取属性值。 - `.attr(properties)`:批量设置属性。 - `.attr(key, value)`:设置...

    Jquery 1.3 简体中文手册

    多库共存 jQuery.noConflict([extreme]) 属性 属性 attr(name) attr(properties) attr(key, value) attr(key, fn) removeAttr(name) CSS 类 addClass(class) removeClass([class]) toggleClass(class [, ...

    jquery1.11.0手册

    多库共存 jQuery.noConflict([ex]) 属性 属性 attr(name|pro|key,val|fn) removeAttr(name) prop(n|p|k,v|f) removeProp(name) CSS 类 addClass(class|fn) removeClass([class|fn]) toggleClass(class|...

Global site tag (gtag.js) - Google Analytics