<cite id="pbjvp"></cite>

        <menuitem id="pbjvp"><em id="pbjvp"></em></menuitem>
        <ins id="pbjvp"></ins>

        <ins id="pbjvp"><video id="pbjvp"><mark id="pbjvp"></mark></video></ins>
        
        

        <output id="pbjvp"><em id="pbjvp"><b id="pbjvp"></b></em></output>

              <i id="pbjvp"><video id="pbjvp"><b id="pbjvp"></b></video></i>
              <mark id="pbjvp"></mark>
              <b id="pbjvp"><em id="pbjvp"><mark id="pbjvp"></mark></em></b>

              Jquery中文网 www.myllop.cn
              Jquery中文网 >  jQuery  >  jquery 教程  >  正文 从jQuery学到的几件事情

              从jQuery学到的几件事情

              发布时间:2016-09-18   编辑:www.myllop.cn
              jquery中文网为您提供从jQuery学到的几件事情等资源,欢迎您收藏本站,我们将为您提供最新的从jQuery学到的几件事情资源

              最近想看一下jquery源码,搜到了这样一篇博客《从jQuery源码学到的10件事情》
              http://www.paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

              本文基于这篇视频博客,提炼了一些内容,分享给大家。

              说明:
              这篇文章写于2010年,作者在视频里使用的是jQuery 1.4版本,我根据视频里讲到的内容,对应目前的1字头1.11版本做了一些调整,一些被抛弃或者被移除的内容页做了删减,并在此感谢原作者https://github.com/paulirish

              黑箱/Black box

              黑箱系统的概念是给定输入返回输出的一个系统,黑箱把实现过程进行封装。这里说的jQuery黑箱是为js全局变量window输出jQuery 和 $,而过程被封装到黑箱里,与外界互不干扰。

              jQuery 1.4版本的黑箱是利用了类似如下的自执行函数

              (function( window, undefined){})(window)
              

              作者给了一个比较通用的实现黑箱的方法

              undefined = true;
              
              (function(window, document, undefined){    
                  if(foo == undefined) {
                      }
              })(this, document)
              

              jQuery的黑箱里多传了第三个形参叫做undefined,而传实参的时候并没有传值,js里没有传值的形参会被设置为undefined,保证了黑箱内部undefined的正确性。js中,undefined作为一个全局属性,是可以被赋值的,比如上述代码中的undefined = true;

              以自执行函数的模式实现黑箱的另外一个好处是利于压缩,比如下述的情况,我们只需要在黑箱内部使用简单的变量。

              (function(A, B, C)){
                  B.getElementById('')
              })(this, document)
              

              作者为匿名函数自执行举了很多例子,比如下面这个,为页面的某一部分不停地更新(以及不断地执行)

              (function loop(){
                  doStuff();
              
                  $('#update').load('awesomething.php',function(){
                      loop();
                  })
                  //setTimeout(loop, 100)
              })()
              

              jQuery 1.11版本的黑箱采用了全新的工厂方法,本文不探究

              noConflict的实现

              这个函数的差异不大,1.11 版本代码如下

              var
                  // Map over jQuery in case of overwrite
                  _jQuery = window.jQuery,
              
                  // Map over the $ in case of overwrite
                  _$ = window.$;
              
              jQuery.noConflict = function( deep ) {
                  if ( window.$ === jQuery ) {
                      window.$ = _$;
                  }
              
                  if ( deep && window.jQuery === jQuery ) {
                      window.jQuery = _jQuery;
                  }
              
                  return jQuery;
              };
              

              我们可以看到防冲突的实现是先把之前的JQuery 和 $ 存起来,noConflict被调用的时候,再还给它们

              与原生js属性命名的转换

              1.4版本用的是props对象来存放jquery对属性操作与原生js属性操作的对应关系
              1.11版缩减版本是这样的

              jQuery.extend({
                  propFix: {
                      "for": "htmlFor",
                      "class": "className"
                  },
              
                  prop: function( elem, name, value ) {
                      //...
                      name = jQuery.propFix[ name ] || name;
                  },
              
                  propHooks: {
                      //...
                  }
              });
              
              jQuery.each([
                  "tabIndex",
                  "readOnly",
                  "maxLength",
                  "cellSpacing",
                  "cellPadding",
                  "rowSpan",
                  "colSpan",
                  "useMap",
                  "frameBorder",
                  "contentEditable"
              ], function() {
                  jQuery.propFix[ this.toLowerCase() ] = this;
              });
              

              propFix 这个对象是存放对应关系表的,比如class转换成className,prop函数负责处理这个关系表。
              而下面的each很有意思,遍历数组中那些属性,然后把他们小写格式对应到自己,放到 propFix

              特效Speed

              我们知道在jQuery里一些动画我们可以直接通过normal,fast,slow 来定义实现速度,这个在源码里是这样定义的

              jQuery.fx.speeds = {
                  slow: 600,
                  fast: 200,
                  // Default speed
                  _default: 400
              };
              

              调皮的原作者做了这样一些事情:

              var isIE 
              //...
              
              jQuery.fx.speeds._default = isIE ? 800 : 400
              jQuery.fx.speeds.veryfast = 200;
              
              $('...').fadeIn('veryfast')
              

              一种是可以对default属性做条件判断,还有一种自定义速度,比如”veryfast”

              .ready

              ready函数 1.11版本和1.4版本有较大的差距,新版中很多东西我也不太能理解,我们就简单的把核心拿出来看一下

              jQuery.ready.promise = function( obj ) {
                  //...省略若干
                      } else if ( document.addEventListener ) {
                          // 使用addEventListener "DOMContentLoaded" 监听ready事件
                          document.addEventListener( "DOMContentLoaded", completed, false );
              
                          // 备选方案 "load"
                          window.addEventListener( "load", completed, false );
              
                      //如果IE
                      } else {
                          // Ensure firing before onload, maybe late but safe also for iframes
                                      //IE下 attachEvent 的"onreadystatechange"
                          document.attachEvent( "onreadystatechange", completed );
              
                          // A fallback to window.onload, that will always work
                                      //备选方案onload
                          window.attachEvent( "onload", completed );
              
                          // If IE and not a frame
                          // continually check to see if the document is ready
                          var top = false;
              
                          try {
                              top = window.frameElement == null && document.documentElement;
                          } catch(e) {}
              
                          if ( top && top.doScroll ) {
                              (function doScrollCheck() {
                                  if ( !jQuery.isReady ) {
              
                                      try {
                                          // Use the trick by Diego Perini
                                          // http://javascript.nwbox.com/IEContentLoaded/
                                          top.doScroll("left");
                                      } catch(e) {
                                          return setTimeout( doScrollCheck, 50 );
                                      }
              
                                      // detach all dom ready events
                                      detach();
              
                                      // and execute any waiting functions
                                      jQuery.ready();
                                  }
                              })();
                          }
                      }
                  }
                  return readyList.promise( obj );
              };
              

              .ready 利用了下面的.promise去做确保载入完成的工作,重点是
              document.addEventListener( "DOMContentLoaded", completed, false );
              window.addEventListener( "load", completed, false );
              document.attachEvent( "onreadystatechange", completed );
              window.attachEvent( "onload", completed );
              兼容性考量的四种检查方式

              其中从top开始,做了一件事情就是IE下面,dom节点判断是否有scroll,在IE下如果dom有scroll,没有scroll到的元素对ready会有影响,这里面我的理解不够,总之jQuery里用到了一个叫做Diego Perini的技巧,可以在注释里的地址看到更多内容。

              选择器

              $('#id').find('tag.thing') --- faster
              
              $('#id tag.thing') ------- using sizzle
              

              原作者在这里说了一个jquery效率的问题,上面的方法更快一些,而下面的方法稍微慢,简单地说是因为下面的方法调用了sizzle,通过sizzle其实转换成上述的模式,而id的调用则是直接过jQuery.init.

              这里需要扩展一下,我们来看一下1.11里jQuery对象究竟长啥样

              jQuery = function( selector, context ) {
                      // The jQuery object is actually just the init constructor 'enhanced'
                      // Need init if jQuery is called (just allow error to be thrown if not included)
                      return new jQuery.fn.init( selector, context );
              }
              

              jQuery对象其实是return了一个它自己的构造函数叫做init,我们再来看一下init做了些什么

              // Initialize a jQuery object
              
                  init = jQuery.fn.init = function( selector, context ) {
                      var match, elem;
              
                      // HANDLE: $(""), $(null), $(undefined), $(false)
                          //超级省略...下略
              
                      // Handle HTML strings
              
                      // HANDLE: $(html) -> $(array)
              
                      // HANDLE: $(html, props)
              
                      // HANDLE: $(#id)
              
                      // HANDLE: $(expr, $(...))
              
                      // HANDLE: $(expr, context)
              
                      // HANDLE: $(DOMElement)
              
                      // HANDLE: $(function)
              
              
                      return jQuery.makeArray( selector, this );
                  };
              
              // Give the init function the jQuery prototype for later instantiation
              init.prototype = jQuery.fn;
              
              

              从上面的摘取的代码注释中,我们可以看到jq自己的构造函数里处理了哪些情况,其中包括html标签名和id的获取,意味着这两种获取是最底层的,此外$()的其他处理都要经过其他的函数,效率上不如上述处理情况。
              同时我们也能看到init的原型被赋予了jQuery.fn, 关于jQuery对象的相关内容,感兴趣的朋友可以再多去了解一些。

              jQ的状态选择符,比如:not,:has,:eq存放在
              Sizzle.selectors.pseudos里面


              您可能感兴趣的文章:
              初窥JQuery(二)事件机制(2)
              jquery常用技巧及常用方法列表集合
              jQuery的学习步骤
              jQuery代码优化 事件委托篇
              jQuery 事件队列调整方法
              jquery 选择器引擎sizzle浅析
              JQuery优缺点分析说明
              事件冒泡是什么如何用jquery阻止事件冒泡
              JQuery优缺点分析说明
              jQuery的运行机制和设计理念分析

              [关闭]
              246好彩天天免费资枓大全 <二四六03024>| <二四六z资料>| <二四六老地主>| <二四六老地主论坛>| <246天天好彩玄机图>| <246天天好彩票玄机图片>| <246好彩天天免费资枓大全>| <二四六天天好彩彩玄机资枓>| <二四天天正版免费资枓大>| <二四六天天好彩每期文字賧料>| <二四六天天好彩毎期文字资料>| <二四六天天好彩毎期文字图片玄机>| <二四六天天人好彩网手机版>| <二四六天天好彩手机版—每期>| <二四六天天好彩免费网手机板>| <二四六天天好手机版本>| <二四六天天好彩彩玄机资枓>| <246好彩天天免费资枓大全>| <二四六天天好彩彩玄机资枓>| <二四天天正版免费资枓大>| <二四天天正版好彩免费资枓1>| <二四六天天好彩头首页>| <二四六天天网手机版>| <二四六玄机图片天天好彩玄机图>| <图片玄机二四六天天好彩资料大全 www.308k.com>| <二四六天天好彩费网站大全>| <精选二四六天天好彩手机版>| <二四六天天好资料大全168>| <二四六天天好来 资料大全>| <二四六天天好资料大全50期蓝月亮>| <246天天免费彩资料大全>| <二四六天天好彩资枓大全>| <二四天天正版免费资枓大全>| <二四六天天好彩免费全年资枓大全>| <二四六天天免费好彩资料大全>| <二四六天天免费好彩资料图>| <二四六天天免费好彩资料大全168>| <743cc二四六天天好釆免费资料>| <246好彩天天免费资枓大全>| <天下釆彩与你同行资料二四六>| <二四六天天好彩资料246>| <二四六天天玄机资料大全>| <308二四六玄机资料大全二四六天天玄机图资料>| <香港二四六玄机资料>| <3o8k com二四六天天好彩文字资枓>| <246好彩天天免费资枓大全>| <二四六好彩资料大全308kk>| <二四六天天好彩彩免费资料大全>| <743cc二四六天天好釆免费资料>| <734cc期期好彩免费资枓大全>| <二四六好彩正版资料>| <308k二四六天好彩资料大全>| <二四六天天,好彩资料开奖>| <玄机二四六天天彩>| <二四六天天天好彩图片玄机>| <二四六天天好彩玄机图库>| <二四六天天如彩正版免费资料大全>| <二四六天天彩玄机免费资料大全>| <二四六天天好彩每期文资子料大全>| <二四六天天香港好彩资料大全>| <二四六天天好彩资料免费大全送>| <香港二四六天天好彩正版资料大全>| <308k二四六好彩资料大全>| <246天天彩免费资料308k>| <246天天好彩资料app>| <二四六天天好彩app下载>| <500502二四六天天彩>| <天天好彩246app>| <246天天好彩资料app>| <二四六天天好彩一每期文字资料>| <二四六天天好彩图片玄机下载>| <246好彩天天免费资枓大全>| <天下釆彩与你同行资料二四六>| <246免费资料大全天天好彩>| <246免费资料大全开>| <246好彩天天免费资枓大全>| <246天天好·彩免费资料大全>| <246天天好彩正版资>| <246天天好彩免费大全资料308k>| | | <新址246天天好彩>| <新址天天好彩二四六>| <246天天好彩开奖944cc>| <246好彩天天免费资枓大全>| <图玄机246天天好彩资料>| <246天天好彩资料全>| <246天天好彩玄机图片>| <246天天好彩免费944cc>| <246556 民间高手论坛>| <246正版天天好彩免费资枓大全>| <246正板天天好彩免费资枓大全>| <308kcom二四六天天彩>| <246玄机图资料天天好彩>| <246天天好彩免费资料大全308>| <二四六免费资料大全正>| <二四六天空彩资料大全>| <二四六天天好彩兔费咨料大全>| <246zl天天好·彩免费资料大全>| <246zl天天944cc好彩免费资料大全>| <二四六正版免费资料大全743cc>| <二四六天天好彩资料大全首页>| <二四六天天好彩免费资料308k>| <二四六免费资料玄机>| <二四六天天好彩资免费大全资料>| <308k二四六天天好彩i>| <246zl天天好·彩免费资料大全>| <二四六天天好彩网手机版 免费>| <天天好彩246资料308图库>| <246天天免费资料大全开奖结果>| <246天天免费资料大全玄机>| <二四六天天好彩免费资料大全168i>| <二四六天天好彩zl246cc>| <精选好彩二四六天天好彩>| <黄大仙精选二四六天天好彩>| | <蓝月亮精选二四六免费天天好彩>| <二四六天天好彩全年免费玄机料>| <二四六图片玄机资料大全>| <二四六玄机图片花仙子>| <香港二四六玄机资料图>| <二四六天天好采玄机资料大全>| <天天二四六玄机>| <二四六天天好彩免费资枓全免费>| <二四六天天好彩资枓免费>| <玄机图二四六天天好彩免费资料>| <二四六天天彩与你同行开奖>| <246好彩天天免费资枓大全>| <二四六天天手机版玄机图资料大全>| <308kcom二四六天天好彩玄机资料>| <二四六好彩正版资料大全>| <香港二四六天天好彩兔费资>| <308k二四六天天好彩 资料>| <二四六玄机图 彩图102>| <二四六天天彩正版资料>| <香港二四六玄机图>| <香港二四六好彩资料246>| <308kcom二四六玄机资料>| <二四六天天好彩正版文字资料大全>| <246天天好彩免费开奖结果>| <246天天好彩免费开奖资料>| <246天天好彩免费资料正版资料>| <2246天天好彩图片玄机>| <246天天好彩图片机>| <二四六天天网彩手机版>| <246 天天好彩免费资料成语挂牌>| <246天天好彩管家婆资料大全>| <246天天好彩综合资料大全>| <308k二四六天天彩>| <二四六天天彩免费玄机资料>| <新址246天天好彩282cc>| <246天天好彩免费944cc>| | <二四六天天好彩944cc资讯>| <246天天好彩308k每期资料>| <246天天好彩308每期资料>| <二四六好彩免费资料图片玄机>| <新址246正版免费资料大全>| <246天天好彩勉费资料大全246>| <新址246zlcom天天好彩资料>| <新址zl 246天天好彩>| <新址246zl cc天天好彩>| <246天天好彩118图片玄机>| <二四六天天好彩马会开奖结果>| <二四六天天好彩手机版开奖结果>| <二四六天天好彩综合资料大全>| <二四六天天好彩308k con>| <二四六天天好彩308k kom>| <246天天好彩免费资大全>| <新址zl246net天天好彩大全>| <246天天好彩玄机资料手机版>| <246天天好天下天空免费>| <二四六天空釆资料大全>| <二四六兔费天天好彩资料>| <二四六308kcom文字资料>| <246天天好天下彩天空开奖>| <二四六免费资料天下>| <二四六天天好彩308k玄机图>| <二四六天天好彩资料开奖>| <308k二四六天天好彩每期>| <308k二四六天天好彩图片玄机>| <二四六天天好彩246zl免费>| <二四六天天好彩 944cc 彩图>| <蓝月亮精选二四六天天好彩>| <二四六天天好彩资料网手机板>| <二四六天天好彩玄机图手机版>| <二四六论坛图片玄机>| <天天二四六玄机图>| <天天彩246免费资料大全>| <246天天好好彩资料免费大全>| <246天天好好彩资料大全>| <二四六免费大全天天彩308>| <香港二四六论坛308k>| <二四六天天彩正版资料大全>| <二四六论坛玄机资料大全>| <308kcom二四六玄机图片>| <308kcom二四六图片玄机>| <308kcom二四六生活幽默>| <玄机图片二四六好彩网>| <玄机资料二四六好彩资料大全>| <246天天好彩308k每期资料大全>|