Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(19)

          隨筆分類(107)

          隨筆檔案(141)

          文章分類(284)

          文章檔案(342)

          相冊

          收藏夾(58)

          家裝

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          1. 總是從ID選擇器開始繼承

          2. 在class前使用tag

          3. 將jquery對象緩存起來

          4. 掌握強大的鏈式操作

          5. 使用子查詢

          6. 對直接的DOM操作進行限制

          7. 冒泡

          8. 消除無效查詢

          9. 推遲到 $(window).load

          10. 壓縮js

          11. 全面掌握jquery庫

          1. 總是從ID選擇器開始繼承

          在jquery中最快的選擇器是ID選擇器. 因為它直接來自于Javascript的getElementById()方法.

          <div id=“content”>
          <form method=“post” action=“/”>
          <h2>Traffic Light</h2>
          <ul id=“traffic_light”>
          <li><input type=“radio” class=“on” name=“light” value=“red” /> Red</li>
          <li><input type=“radio” class=“off” name=“light” value=“yellow” /> Yellow</li>
          <li><input type=“radio” class=“off” name=“light” value=“green” /> Green</li>
          </ul>
          <input class=“button” id=“traffic_button” type=“submit” value=“Go” />
          </form>
          </div>

          像這樣選擇按鈕是低效的:

          var traffic_button = $(‘#content .button’);

          用ID直接選擇按鈕效率更高:

          var traffic_button = $(‘#traffic_button’);

          選擇多個元素

          提到多元素選擇其實是在說DOM遍歷和循環, 這些都是比較慢的東西.為了提高性能, 最好從就近的ID開始繼承.

          var traffic_lights = $(‘#traffic_light input’);

          2. 在class前使用tag

          第二快的選擇器是tag選擇器($(’head’)). 同理,因為它來自原生的getElementsByTagName() 方法.

          <div id=“content”>
          <form method=“post” action=“/”>
          <h2>Traffic Light</h2>
          <ul id=“traffic_light”>
          <li><input type=“radio” class=“on” name=“light” value=“red” /> Red</li>
          <li><input type=“radio” class=“off” name=“light” value=“yellow” /> Yellow</li>
          <li><input type=“radio” class=“off” name=“light” value=“green” /> Green</li>
          </ul>
          <input class=“button” id=“traffic_button” type=“submit” value=“Go” />
          </form>
          </div>

          總是用一個tag name來限制(修飾)class (并且不要忘記就近的ID):

          var active_light = $(‘#traffic_light input.on’);

          注意: 在jquery中Class是最慢的選擇器. IE瀏覽器下它會遍歷所有DOM節點不管它用在那里.

          不要用用tag name來修飾ID. 下面的例子將會遍歷所有的div元素來查找id為’content’的哪一個節點:

          var content = $(‘div#content’);

          用ID修飾ID也是畫蛇添足:

          var traffic_light = $(‘#content #traffic_light’);

          3.將jquery對象緩存起來

          要養成將jquery對象緩存進變量的習慣.

          永遠不要這樣做:

          $(‘#traffic_light input.on).bind(’click‘, function(){…});
          $(’#traffic_light input.on).css(‘border’, ‘3px dashed yellow’);
          $(‘#traffic_light input.on).css(’background-color‘, ‘orange‘);
          $(’#traffic_light input.on).fadeIn(’slow’);

          最好先將對象緩存進一個變量然后再操作:

          var $active_light = $(‘#traffic_light input.on’);
          $active_light.bind(‘click’, function(){…});
          $active_light.css(‘border’, ‘3px dashed yellow’);
          $active_light.css(‘background-color’, ‘orange’);
          $active_light.fadeIn(’slow’);

          為了記住我們本地變量是jquery的封裝, 通常用一個$作為變量前綴. 記住,永遠不要讓相同的選擇器在你的代碼里出現多次.
          緩存jquery結果,備用

          如果你打算將jquery結果對象用在程序的其它部分,或者你的function會多次執行, 那么就將他們緩存到一個全局變量中.

          定義一個全局容器來存放jquery結果, 我們就可以在其它函數引用它們:

          // 在全局范圍定義一個對象 (例如: window對象)
          window.$my =
          {
          // 初始化所有可能會不止一次要使用的查詢
          head : $(‘head’),
          traffic_light : $(‘#traffic_light’),
          traffic_button : $(‘#traffic_button’)
          };

          function do_something()
          {
          // 現在你可以引用存儲的結果并操作它們
          var script = document.createElement(’script’);
          $my.head.append(script);

          // 當你在函數內部操作是, 可以繼續將查詢存入全局對象中去.
          $my.cool_results = $(‘#some_ul li’);
          $my.other_results = $(‘#some_table td’);

          // 將全局函數作為一個普通的jquery對象去使用.
          $my.other_results.css(‘border-color’, ‘red’);
          $my.traffic_light.css(‘border-color’, ‘green’);
          }

          4. 掌握強大的鏈式操作

          上面的例子也可以寫成這樣:

          var $active_light = $(‘#traffic_light input.on’);$active_light.bind(‘click’, function(){…})
          .css(‘border’, ‘3px dashed yellow’)
          .css(‘background-color’, ‘orange’)
          .fadeIn(’slow’);

          這樣可以寫更少的代碼, 讓我們的js更輕量.

          5.使用子查詢

          jQuery 允許我們對一個已包裝的對象使用附加的選擇器操作. 因為我們已經在保存了一個父級對象在變量里, 這樣大大提高對其子元素的操作:

          <div id=“content”>
          <form method=“post” action=“/”>
          <h2>Traffic Light</h2>
          <ul id=“traffic_light”>
          <li><input type=“radio” class=“on” name=“light” value=“red” /> Red</li>
          <li><input type=“radio” class=“off” name=“light” value=“yellow” /> Yellow</li>
          <li><input type=“radio” class=“off” name=“light” value=“green” /> Green</li>
          </ul>
          <input class=“button” id=“traffic_button” type=“submit” value=“Go” />
          </form>
          </div>

          例如, 我們可以用子查詢的方法來抓取到亮或不亮的燈, 并緩存起來以備后續操作.

          var $traffic_light = $(‘#traffic_light’),
          $active_light = $traffic_light.find(‘input.on’),
          $inactive_lights = $traffic_light.find(‘input.off’);

          提示: 你可以用逗號分隔的方法一次聲明多個局部變量–節省字節數

          6.對直接的DOM操作進行限制

          這里的基本思想是在內存中建立你確實想要的東西,然后更新DOM 。這并不是一個jQuery最佳實踐,但必須進行有效的JavaScript操作 。直接的DOM操作速度很慢。

          例如,你想動態的創建一組列表元素, 千萬不要這么做:

          var top_100_list = [...], // 假設這里是100個獨一無二的字符串
          $mylist = $(‘#mylist’); // jQuery 選擇到 <ul> 元素
          for (var i=0, l=top_100_list.length; i’ + top_100_list[i] + ‘</li>’);
          }

          我們應該將整套元素字符串在插入進dom中之前全部創建好:

          var top_100_list = [...],
          $mylist = $(‘#mylist’),
          top_100_li = “”; // 這個變量將用來存儲我們的列表元素
          for (var i=0, l=top_100_list.length; i’ + top_100_list[i] + ‘</li>’;
          }
          $mylist.html(top_100_li);

          我們在插入之前將多個元素包裹進一個單獨的父級節點會更快:

          var top_100_list = [...],
          $mylist = $(‘#mylist’),
          top_100_ul = ‘<ul id=”#mylist”>’;
          for (var i=0, l=top_100_list.length; i’ + top_100_list[i] + ‘’;
          }
          top_100_ul += ‘</ul>’; //關閉無序列表
          $mylist.replaceWith(top_100_ul);

          如果你做了以上幾條還是擔心有性能問題,那么:

          * 試試jquery的 clone() 方法, 它會創建一個節點樹的副本, 它允許以”離線”的方式進行dom操作, 當你操作完成后再將其放回到節點樹里.

          * 使用DOM DocumentFragments. 正如jQuery作者所言, 它的性能要明顯優于直接的dom操作.

          7. 冒泡

          除非在特殊情況下, 否則每一個js事件(例如:click, mouseover, 等.)都會冒泡到父級節點. 當我們需要給多個元素調用同個函數時這點會很有用.

          代替這種效率很差的多元素事件監聽的方法就是, 你只需向它們的父節點綁定一次, 并且可以計算出哪個節點觸發了事件.

          例如, 我們要為一個擁有很多輸入框的表單綁定這樣的行為: 當輸入框被選中時為它添加一個class

          像這樣綁定事件是低效的:

          $(‘#entryform input).bind(‘focus‘, function(){
          $(this).addClass(‘selected‘);
          }).bind(‘blur‘, function(){
          $(this).removeClass(‘selected‘);
          });

          我們需要在父級監聽獲取焦點和失去焦點的事件:

          $(‘#entryform’).bind(‘focus’, function(e){
          var cell = $(e.target); // e.target grabs the node that triggered the event.
          cell.addClass(’selected’);
          }).bind(‘blur’, function(e){
          var cell = $(e.target);
          cell.removeClass(’selected’);
          });

          父級元素扮演了一個調度員的角色, 它可以基于目標元素綁定事件. 如果你發現你給很多元素綁定了同一個事件監聽, 那么你肯定哪里做錯了.

          8.消除無效查詢

          盡管jquery可以很優雅的處理沒有匹配元素的情況, 但它還是需要花費時間去尋找. 如果你整站只有一個全局js, 那么極有可能把所有的jquery函數塞進$(document)ready(function(){//所有你引以為傲的代碼})里.

          只運行在頁面里用到的函數. 大多數有效的方法就是使用行內初始化函數, 這樣你的模板就能準確的控制何時何處該執行js.

          例如, 你的”文章”頁面模板, 你可能會引用如下的代碼在body結束處:

          <script type=“text/javascript>
          mylib.article.init();
          </script>
          </body>

          如果你的頁面模板包含一些多變的模塊可能不會出現在頁面中, 或者為了視覺呈現的原因你需要它們能夠快速加載, 你可以將初始化函數緊跟在模塊之后.

          <ul id=“traffic_light”>
          <li><input type=“radio” class=“on” name=“light” value=“red” /> Red</li>
          <li><input type=“radio” class=“off” name=“light” value=“yellow” /> Yellow</li>
          <li><input type=“radio” class=“off” name=“light” value=“green” /> Green</li>
          </ul>
          <script type=“text/javascript>
          mylib.traffic_light.init();
          </script>

          你的全局js庫可能會是這樣子的:

          var mylib ={
          article_page :{
          init : function(){
          // Article 特有的jQuery函數.
          }
          },
          traffic_light : {
          init : function() {
          // Traffic light 特有的jQuery函數.
          }
          }
          }

          9. 推遲到 $(window).load

          jquery對于開發者來說有一個很誘人的東西, 可以把任何東西掛到$(document).ready下冒充事件. 在大多數例子中你都會發現這樣的情況.

          盡管$(document).rady 確實很有用, 它可以在頁面渲染時,其它元素還沒下載完成就執行. 如果你發現你的頁面一直是載入中的狀態, 很有可能就是$(document).ready函數引起的.

          你可以通過將jquery函數綁定到$(window).load 事件的方法來減少頁面載入時的cpu使用率. 它會在所有的html(包括iframe)被下載完成后執行.

          $(window).load(function(){
          // 頁面完全載入后才初始化的jQuery函數.
          });

          多余的功能例如拖放, 視覺特效和動畫, 預載入隱藏圖像,等等. 都是適合這種技術的場合.

          10. 壓縮js

          推薦一個js在線壓縮地址: http://dean.edwards.name/packer/

          posted on 2010-08-05 13:31 禮物 閱讀(366) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。

          網站導航:
           
          主站蜘蛛池模板: 马关县| 景谷| 浮梁县| 兴安盟| 涿鹿县| 宾川县| 文登市| 肇源县| 同江市| 闽侯县| 比如县| 三河市| 连州市| 韩城市| 梁河县| 达日县| 临朐县| 十堰市| 即墨市| 蓝山县| 梅河口市| 武穴市| 石台县| 临清市| 聊城市| 南和县| 阿克陶县| 尼木县| 抚顺县| 泽普县| 蒙城县| 浪卡子县| 鱼台县| 阿尔山市| 施秉县| 荃湾区| 务川| 灵武市| 邢台县| 柳河县| 鸡东县|