15个值得开发人员关注的jQuery开发技巧和心得

fmms 12年前
     <div class="BlogContent TextContent">     <h4>1. 尽量使用最新版本的jQuery类库</h4>     <p>jQuery项目中使用了大量的创新。最好的方法来提高性能就是使用最新版本的jQuery。每一个新的版本都包含了优化的bug修复。对我们来说唯一要干的就是修改tag,何乐而不为呢?</p>     <p>我们也可以使用免费的CDN服务,例如, Google来存放jQuery类库。</p>     <pre><code>                                <!-- Include a specific version of jQuery -->                                <script src=<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">                                   "http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js">                                      <!-- Include the latest version <span style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;color:#4169e1;font-weight:bold;">in</span> the <span style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;color:red;">1.6</span> branch -->                                     <script src=<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">                                        "http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js">                                     </script src=<span>                              </script src=<span></code></pre>     <h4>2. 使用简单的选择器</h4>     <p>直到最近,返回DOM元素的方式都是解析选择器字符串,javascript循环和内建的javascript API例如,getElementbyId(),getElementsByTagName(),getElementsByClassName()三种方式的整合使用。但是现代浏览器都开始支持querySelectorAll(),这个方法能够理解CSS查询器,而且能带来显著的性能提升。</p>     <p>然而,我们应该避免使用复杂的选择器返回元素。更不用说很多用户使用老版本的浏览器,强迫jQuery去处理DOM树。这个方式非常慢。</p>     <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'li[data-selected="true"] a'</span>)    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Fancy, but slow </span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'li.selected a'</span>)    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Better </span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#elem'</span>)    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Best</span> </code></pre>     <p>选择id是最快速的方式。如果你需要使用class名称, 那么你最好带上tag名称,这样会更快些。特别是在老浏览器和移动设备上。</p>     <p>访问DOM是javascript应用最慢的方式 ,因此尽量少使用。使用变量去保存选择器,这样会使用cache来保存。性能更好。</p>     <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> buttons = $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#navigation a.button'</span>);  <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Some prefer prefixing their jQuery variables with $: </span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> $buttons = $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#navigation a.button'</span>); </code></pre>     <p>另外一个值得做的是jQuery给了你很多的额外便利选择器 ,例如,:visible,:hidden,:animated还有其它,这些不是合法的CSS3选择器。结果是你使用这些类库就不能有效地利用 querySelectorAll()方法。为了弥补这个问题,你需要先选择元素,再过滤,如下:</p>     <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'a.button:animated'</span>);    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Does not use querySelectorAll() </span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'a.button'</span>).filter(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">':animated'</span>);    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Uses it</span> </code></pre>     <h4>3. 数组方式使用jQuery对象</h4>     <p>运行选择器的结果是一个jQuery对象。然而,jQuery类库让你感觉你正在使用一个定义了index和长度的数组。</p>     <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Selecting all the navigation buttons:</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> buttons = $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#navigation a.button'</span>); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// We can loop though the collection:</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">for</span>(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> i=;i                              <buttons.length;i++)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">                                   {      console.log(buttons[i]);                                       <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// A DOM element, not a jQuery object</span>                                    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>                                    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// We can even slice it:</span>                                    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> firstFour = buttons.slice(,                                   <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">4</span>);                               </buttons.length;i++)<span></code></pre>     <p>如果性能是你关注的,那么使用简单for或者while循环来处理,而不是$.each(),这样能使<a href="/misc/goto?guid=4959221337380849356" rel="nofollow" target="_blank">你的代码更快</a>。</p>     <p>检查长度也是一个检查你的collection是否含有元素的方式。</p>     <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">if</span>(buttons)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// This is always true</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Do something</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">if</span>(buttons.length)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// True only if buttons contains elements</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Do something</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span> </code></pre>     <h4>4. 选择器属性</h4>     <p>jQuery提供了一个属性,这个属性显示了用来做链式的选择器。</p>     <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#container li:first-child'</span>).selector    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// #container li:first-child</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#container li'</span>).filter(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">':first-child'</span>).selector    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// #container li.filter(:first-child)</span> </code></pre>     <p>虽然上面的例子针对同样的元素,选择器则完全不一样。第二个实际上是非法的,你不可以使用它来创建一个对象。只能用来显示filter方法是用来缩小collection。</p>     <h4>5. 创建一个空的jQuery对象</h4>     <p>创建一个新的jQuery空间能极大的减小开销。有时候,你可能需要创建一个空的对象,然后使用add()方法添加对象。</p>     <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> container = $([]);   container.add(another_element); </code></pre>     <p>这也是quickEach方法的基础,你可以使用这种更快的方式而非each()。</p>     <h4>6. 选择一个随机元素</h4>     <p>上面我提到过,jQuery添加它自己的选择器过滤。除了类库,你可以添加自己的过滤器。只需要添加一个新的方法到$.expr[':']对象。一个非常棒的使用方式是Waldek Mastykarz的<a href="/misc/goto?guid=4959221339455204792" rel="nofollow" target="_blank">博客</a>中提到的:创建一个用来返回随机元素的选择器。你可以修改下面代码:</p>     <pre><code>  (<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>($)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>     <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> random = ;     $.expr[<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">':'</span>].random = <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>(a, i, m, r) <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">if</span> (i == ) <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>               random = <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#ff1493;padding-top:0px;">Math</span>.floor(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#ff1493;padding-top:0px;">Math</span>.random() * r.length);           <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>            <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">return</span> i == random;     <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>; <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>)(jQuery); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// This is how you use it:</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'li:random'</span>).addClass(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'glow'</span>); </code></pre>     <h4>7. 使用CSS Hooks</h4>     <p>CSS hooks API是提供开发人员得到和设置特定的CSS数值的方法。使用它,你可以隐藏浏览器特定的执行并且使用一个统一的界面来存取特定的属性。、</p>     <pre><code>  $.cssHooks[<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'borderRadius'</span>] = <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          get: <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>(elem, computed, extra)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Depending on the browser, read the value of</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// -moz-border-radius, -webkit-border-radius or border-radius      </span>           <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>,          set: <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>(elem, value)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Set the appropriate CSS3 property</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>; <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Use it without worrying which property the browser actually understands:</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#rect'</span>).css(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'borderRadius'</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">5</span>); </code></pre>     <p>更好的在于,人们已经创建了一个支持<a href="/misc/goto?guid=4959221339708709816" rel="nofollow" target="_blank">CSS hooks类库</a></p>     <h4>8. 使用自定义的缓动方法</h4>     <p>你可能听到过jQuery的<a href="/misc/goto?guid=4958188557383566796" rel="nofollow" target="_blank">缓动插件</a>,它能够允许你给你的动画添加特效。唯一的缺点是你的访问者需要加载另外一个javascript文件。幸运的是,你可以简单的从插件拷贝效果,并且添加到jQuery.easing对象中,如下:</p>     <pre><code>  $.easing.easeInOutQuad = <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span> (x, t, b, c, d) <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">if</span> ((t/=d/<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">2</span>) < <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">1</span>) <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">return</span> c/<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">2</span>*t*t + b;      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">return</span> -c/<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">2</span> * ((--t)*(t<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">-2</span>) - <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">1</span>) + b; <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>;       <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// To use it:</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#elem'</span>).animate(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>width:<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">200</span><span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'slow'</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'easeInOutQuad'</span>); </code></pre>     <h4>9. $.proxy()</h4>     <p>使用callback方法的缺点之一是当执行类库中的方法后,context被设置到另外一个元素,例如:</p>     <pre><code>                                <div id=<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">                                   "panel" style=                                   <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"display:none"</span>>                                    <button>Close</button>                               </div id=<span></code></pre>    </div>    <code>  </code>    <pre></pre>    <p>执行下面代码:</p>    <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#panel'</span>).fadeIn(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// this points to #panel</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#panel button'</span>).click(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// this points to the button</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">this</span>).fadeOut();      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>); </code></pre>    <p>你将遇到问题,button会消失,不是panel。使用$.proxy方法,你可以这样书写代码:</p>    <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#panel'</span>).fadeIn(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Using $.proxy to bind this:</span>      $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#panel button'</span>).click($.proxy(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// this points to #panel</span>          $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">this</span>).fadeOut();          <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">this</span>)); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>); </code></pre>    <p>这样才正确的执行。$.proxy方法接受两个参数,你最初的方法,还有context。这里阅读更多<a href="/misc/goto?guid=4959221340066497026" rel="nofollow" target="_blank">$.proxy in the docs</a>.。</p>    <h3>10. 判断页面是否太过复杂</h3>    <p>一个非常简单的道理,约复杂的页面,加载的速度越慢。你可以使用下面代码检查一下你的页面内容:</p>    <pre><code>  console.log( $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'*'</span>).length ); </code></pre>    <p>以上代码返回的数值越小,网页加载速度越快。你可以考虑通过删除无用多余的元素来优化你的代码</p>    <h4>11. 将你的代码转化成jQuery插件</h4>    <p>如果你要花一定得时间去开发一段jQuery代码,那么你可以考虑将代码变成插件。这将能够帮助你重用代码,并且能够有效的帮助你组织代码。创建一个插件代码如下:</p>    <pre><code>  (<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>($)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      $.fn.yourPluginName = <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Your code goes here</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">return</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">this</span>;      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>; <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>)(jQuery); </code></pre>    <p>你可以在这里阅读更多开发教程。</p>    <h4>12. 设置全局AJAX为缺省</h4>    <p>如果你开发ajax程序的话,你肯定需要有”加载中“之类的显示告知用户,ajax正在进行,我们可以使用如下代码统一管理,如下:</p>    <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// ajaxSetup is useful for setting general defaults:</span>  $.ajaxSetup(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      url            : <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'/ajax/'</span>,      dataType    : <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'json'</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>);    $.ajaxStart(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      showIndicator();      disableButtons(); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>);    $.ajaxComplete(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      hideIndicator();      enableButtons(); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>);   <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:gray;padding-top:0px;">/*      // Additional methods you can use:      $.ajaxStop();      $.ajaxError();      $.ajaxSuccess();      $.ajaxSend();  */</span> </code></pre>    <h4>13. 在动画中使用delay()方法</h4>    <p>链式的动画效果是jQuery的强大之处。但是有一个忽略了的细节就是你可以在动画之间加上delays,如下:</p>    <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// This is wrong:</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#elem'</span>).animate(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>width:<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">200</span><span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      setTimeout(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#4169e1;font-weight:bold;padding-top:0px;">function</span>()<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>          $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#elem'</span>).animate(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>marginTop:<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">100</span><span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>);      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>,<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">2000</span>); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>);   <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Do it like this:</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'#elem'</span>).animate(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>width:<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">200</span><span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>).delay(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">2000</span>).animate(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>marginTop:<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;padding-top:0px;">100</span><span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>); </code></pre>    <p>jQuery动画帮了我们大忙,否则我们得自己处理一堆的细节,设置timtout,处理属性值,跟踪动画变化等等。</p>    <p>大家可以参考这个文章:<a href="/misc/goto?guid=4958183375008784811" rel="nofollow" target="_blank">jQuery animations</a></p>    <h4>14. 合理利用HTML5的Data属性</h4>    <p>HTML5的data属性可以帮助我们插入数据。特别合适前后端的数据交换。jQuery近来发布的data()方法,可以有效的利用HTML5的属性,来自动得到数据。下面是个例子:</p>    <p> </p>    <pre><code>                           <div id=<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">                              "d1" data-role=                              <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"page"</span> data-last-value=                              <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"43"</span> data-hidden=                              <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"true"</span>      data-options=                              <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">'{"name":"John"}'</span>>                               <div></div>                           </div id=<span></code></pre>    <p>为了存取数据你需要调用如下代码:</p>    <pre><code>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"#d1"</span>).data(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"role"</span>);            <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// "page"</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"#d1"</span>).data(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"lastValue"</span>);        <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// 43</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"#d1"</span>).data(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"hidden"</span>);        <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// true;</span>  $(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"#d1"</span>).data(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"options"</span>).name;    <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// "John";</span> </code></pre>    <p>data()的jQuery文档:<a href="/misc/goto?guid=4958973165121397839" rel="nofollow" target="_blank">data() in the jQuery docs</a></p>    <h4>15. 本地存储和jQuery</h4>    <p>本地存储是一个超级简单的API。简单的添加你的数据到localStorage全局属性中:</p>    <pre><code> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Check if "key" exists in the storage</span> <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">var</span> value = $.jStorage.get(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"key"</span>); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:navy;font-weight:bold;padding-top:0px;">if</span>(!value)<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">{</span>      <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// if not - load the data from the server</span>       value = load_data_from_server();       <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// and save it</span>      $.jStorage.set(<span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:teal;padding-top:0px;">"key"</span>,value); <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:red;font-weight:bold;padding-top:0px;">}</span>   <span style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:green;padding-top:0px;">// Use value</span> </code></pre>    <p>但是对于老的浏览器来说,这个不是个好消息。因为他们不支持。但是我们可以使用<a href="/misc/goto?guid=4959221340486598731" rel="nofollow" target="_blank">jQuery的插件</a>来提供支持一旦本地存储不能用的话。这种方式可以使得本地存储功能正常工作。</p>    <div></div>