對于僅限于個人使用的函數,一般來說還是把它保存在項目的命名空間中最方便。換句話說,不要保存在 jQuery 命名空間中,而要選擇一個我們自己的全局對象。比如說,可以將 ljQ 作為全局對象,那么 $.mathUtils.sum() 和$.mathUtils.average() 就 要 寫 成 ljQ.mathUtils.sum() 和 ljQ.math-Utils.average() 了。這樣,就可以徹底避免自定義的插件方法與第三方插件方法發生命名沖突。
三十五、添加 jQuery 對象方法
添加全局函數需要以新方法來擴展 jQuery 對象。添加實例方法也與此類似,但擴展的卻是 jQuery.fn 對象:
jQuery.fn 對象是 jQuery.prototype 的別名,使用別名是出于簡潔的考慮。一個合理的實例方法應該包含對它的上下文的操作。
在任何插件方法內部,關鍵字 this 引用的都是當前的jQuery對象。因而,可以在 this 上面調用任何內置的jQuery方法,或者提取它包含的DOM節點并操作該節點。在調用的 .each() 方法內部, this 依次引用每個DOM元素。
除了隱式迭代之外,jQuery用戶也應該能夠正常使用連綴行為。因而,我們必須在所有插件方法中返回一個jQuery對象,除非相應的方法明顯用于取得不同的資訊。返回的jQuery對象通常就是 this 所引用的對象。
(function($) { $.fn.swapClass = function(class1, class2) { return this.each(function() { var $element = $(this); if ($element.hasClass(class1)) { $element.removeClass(class1).addClass(class2); } else if ($element.hasClass(class2)) { $element.removeClass(class2).addClass(class1); } }); }; })(jQuery);三十六、由于某些瀏覽器中的 scroll 事件會在窗口滾動期間重復觸發,因此計算過程會不斷累積。最終結果就是導致頁面忽急忽緩、反應遲頓。
瀏覽器中有幾個原生事件都會頻繁觸發。最常見的事件有 scroll 、resize 和 mousemove 。為了解決這個問題,就需要節流事件。這個技術會限制一些無謂的計算,即不是每次事件發生都計算,而是選擇在部分事件發生時計算。
$(document).ready(timer = 0; $(window).scroll((!timer) { timer = setTimeout(function() { checkScrollPosition(); timer = 0; }, 250); } }).trigger('scroll'); });前面這種節流技術可以說既簡單又實用。但是,節流的方案可不止那一種。根據被節流的操作的特點,以及與頁面的典型交互方式,我們可以直接給頁面創建一個計時器,而不是等事件開始時再創建。
$(document).ready(scrolled = false; $(window).scroll(function() { scrolled = true; }); setInterval((scrolled) { checkScrollPosition(); scrolled = false; } }, 250); checkScrollPosition(); });與前面的節流代碼不同,這個輪詢式的方案會調用JavaScript的 setInterval() 函數,每250毫秒檢查一次 scrolled 變數的狀態。不管什么時候發生滾動事件, scrolled 都會被設置為 true ,以確保在下一次輪詢時調用 checkScrollPosition() 。
三十七、中止動畫的注意事項
由于 .stop() 方法默認情況下會在動畫的當前位置中止動畫,因而在使用簡寫動畫方法的情況下,就有可能導致意外的結果。在動畫之前,這些簡寫的動畫方法會確定最終的值,然后動態變化到該值。比如說,如果使用 .stop() 在 .slideDown() 動畫的中途將其中止,然后調用 .slideUp() 。那么下次再在同一個元素上調用 .slideDown() 時,就只會向下滑動到上一次停止時的高度。為了解決這個問題, .stop() 方法可以接收兩個布爾值參數( true/false ),其中第二個參數叫 goToEnd 。如果把這個參數設置為 true ,那么當前動畫不僅會停止,而且會立即跳到最終值。當然,這樣做的結果就是看起來有點突兀。所以更好的辦法是把最終值保存在一個變數中,使用 .animate() 顯式變化到該值,而不要依賴jQuery確定的值。
jQuery還有一個方法可以中斷動畫: .finish() 。這個方法與 .stop(true,true) 效果類似,因為它會清除排隊的動畫并使當前動畫跳到最終值。不過,與 .stop(true, true) 不同的是,它也會使所有排隊的動畫都跳到各自的最終值。
三十八、全局效果內容
jQuery的效果模塊中包含一個非常方便的 $.fx 對象,在需要徹底改變動畫的性質時,可以訪問這個對象。盡管這個對象的某些內容名不見經傳,只為jQuery庫本身使用而設計,但另外一些內容則可以供我們在全局層面上修改動畫運行的效果。