新聞中心
本系列文章將帶您進(jìn)入jQuery的精彩世界, 其中有很多作者具體的使用經(jīng)驗(yàn)和解決方案, 即使你會(huì)使用jQuery也能在閱讀中發(fā)現(xiàn)些許秘籍.我們經(jīng)常要使用腳本處理各種業(yè)務(wù)邏輯, 最常見(jiàn)的就是數(shù)組和對(duì)象的操作. jQuery工具函數(shù)為我們操作對(duì)象和數(shù)組提供了便利條件。大部分人僅僅使用jQuery的選擇器選擇對(duì)象, 或者實(shí)現(xiàn)頁(yè)面動(dòng)畫效果. 在處理業(yè)務(wù)邏輯時(shí)常常自己編寫很多算法. 本文提醒各位jQuery也能提高我們操作對(duì)象和數(shù)組的效率. 并且可以將一些常用算法擴(kuò)充到j(luò)Query工具函數(shù)中, 實(shí)現(xiàn)腳本函數(shù)的復(fù)用.

推薦專題:jQuery從入門到精通
一.什么是工具函數(shù)
工具函數(shù)是指在jQuery對(duì)象(即變量"$")上定義的函數(shù). 這些函數(shù)都是工具類函數(shù).比如C#中最常用的trim()函數(shù):
- $.trim(" text ");
在原始javascript中并沒(méi)有提供同時(shí)去除前后空格的trim函數(shù). 所以這一類常用的工具函數(shù)統(tǒng)稱為 "Utilities" 函數(shù).對(duì)應(yīng)jQuery官方文檔:
http://docs.jquery.com/Utilities
"$"其實(shí)是"window"對(duì)象的屬性, 所以下面幾句話是等價(jià)的:
二. 工具函數(shù)分類
工具函數(shù)主要分為下面幾類:
◆ 瀏覽器及特性檢測(cè)
◆ 數(shù)組和對(duì)象操作
◆ 測(cè)試操作
◆ 字符串操作
◆ Url操作
區(qū)別于前幾章的講解方式, 本文不在列舉函數(shù)列表. 大家在應(yīng)用中, 比如遇到想操作一個(gè)字符串, 可以首先從在"API文檔/Utilities/字符串操作"中查找是否已經(jīng)提供了快捷的工具函數(shù). 如果沒(méi)有再考慮自己開(kāi)發(fā).
下面使用實(shí)例具體的每個(gè)分類下常用的工具函數(shù).
三.瀏覽器及特性檢測(cè)
jQuery的優(yōu)秀就在于其跨瀏覽器的特性, 通常我們不用再針對(duì)不同瀏覽器書(shū)寫不同的代碼. 但是如果是jQuery開(kāi)發(fā)人員或者插件開(kāi)發(fā)人員就要自行處理瀏覽器差異, 以便為用戶提供跨瀏覽器的特性.
jQuery提供了下列屬性用于獲取瀏覽器特性:
| jQuery.support | 1.3版本新增 |
| jQuery.browser | 已廢除 |
| jQuery.browser | 已廢除 |
| jQuery.browser | 已廢除 |
在1.3版本中已經(jīng)廢除了三個(gè)屬性, 這里不再講解. 讓我們將注意力放在 jQuery.support 函數(shù)上.
jQuery.support
返回值: Object
說(shuō)明:
jQuery 1.3 新增。一組用于展示不同瀏覽器各自特性和bug的屬性集合。
jQuery提供了一系列屬性,你也可以自由增加你自己的屬性。其中許多屬性是很低級(jí)的,所以很難說(shuō)他們能否在日新月異的發(fā)展中一直保持有效,但這這些主要用于插件和內(nèi)核開(kāi)發(fā)者。
所有這些支持的屬性值都通過(guò)特性檢測(cè)來(lái)實(shí)現(xiàn),而不是用任何瀏覽器檢測(cè)。以下有一些非常棒的資源用于解釋這些特性檢測(cè)是如何工作的:
http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting
http://yura.thinkweb2.com/cft/
http://www.jibbering.com/faq/faq_notes/not_browser_detect.html
jQuery.support主要包括以下測(cè)試:
boxModel:如果這個(gè)頁(yè)面和瀏覽器是以W3C CSS盒式模型來(lái)渲染的,則等于true。通常在IE 6和IE 7的怪癖模式中這個(gè)值是false。在document準(zhǔn)備就緒前,這個(gè)值是null。
cssFloat: 如果用cssFloat來(lái)訪問(wèn)CSS的float的值,則返回true。目前在IE中會(huì)返回false,他用styleFloat代替。
hrefNormalized:如果瀏覽器從getAttribute("href")返回的是原封不動(dòng)的結(jié)果,則返回true。在IE中會(huì)返回false,因?yàn)樗腢RLs已經(jīng)常規(guī)化了。
htmlSerialize:如果瀏覽器通過(guò)innerHTML插入鏈接元素的時(shí)候會(huì)序列化這些鏈接,則返回true,目前IE中返回false。
leadingWhitespace:如果在使用innerHTML的時(shí)候?yàn)g覽器會(huì)保持前導(dǎo)空白字符,則返回true,目前在IE 6-8中返回false。
noCloneEvent:如果瀏覽器在克隆元素的時(shí)候不會(huì)連同事件處理函數(shù)一起復(fù)制,則返回true,目前在IE中返回false。
objectAll:如果在某個(gè)元素對(duì)象上執(zhí)行g(shù)etElementsByTagName("*")會(huì)返回所有子孫元素,則為true,目前在IE 7中為false。
opacity:如果瀏覽器能適當(dāng)解釋透明度樣式屬性,則返回true,目前在IE中返回false,因?yàn)樗胊lpha濾鏡代替。
scriptEval:使用 appendChild/createTextNode 方法插入腳本代碼時(shí),瀏覽器是否執(zhí)行腳本,目前在IE中返回false,IE使用 .text 方法插入腳本代碼以執(zhí)行。
style: 如果getAttribute("style")返回元素的行內(nèi)樣式,則為true。目前IE中為false,因?yàn)樗胏ssText代替。
tbody: 如果瀏覽器允許table元素不包含tbody元素,則返回true。目前在IE中會(huì)返回false,他會(huì)自動(dòng)插入缺失的tbody。
講解:
針對(duì)上面眾多的瀏覽器特性屬性, 本文只講解兩個(gè)特性.
1.盒式模型 boxModel
下圖是W3C標(biāo)準(zhǔn)中的盒式模型圖:
假設(shè)如下元素:
顯示效果如圖:
[[32231]]
在CSS中設(shè)定元素寬度為200px, 下面以此元素為例講解盒式模式.
W3C 盒式模型:
元素的寬度和高度為盒式模型圖中的Context部分, 不包括padding, border和margin部分.
目前除了IE所有的瀏覽器都僅支持W3C盒式模型. 在W3C盒式模型中, 示例中包含紅框在內(nèi)的區(qū)域內(nèi)容寬度為200+2*10+2*5=230px, 高度為50+2*10+2*5=80px.
IE 盒式模型:
設(shè)置的寬度包括padding,border. 實(shí)際內(nèi)容寬度content Width = width - padding – border
在IE5.5及更早的版本中, 使用了此模型. 在更高的IE版本上如果由于某些原因讓瀏覽器運(yùn)行在怪異模式下則也會(huì)使用此盒式模式.所以需要在頁(yè)面上聲明正確的DOCTYPE. 有關(guān)DOCTYPE請(qǐng)參考此文:
http://www.cnblogs.com/zhangziqiu/archive/2009/01/15/doctype.html
下面是兩種盒式模式的對(duì)比:
我們可以使用 jQuery.support.boxModel 屬性來(lái)獲取瀏覽器是否使用了W3C盒式模型. true表示使用W3C boxModel.
2.浮動(dòng)樣式
通過(guò)javascript腳本設(shè)置元素的float樣式時(shí), IE和FireFox存在不同, IE使用style.styleFloat, FireFox使用style.cssFloat:
- div.style.styleFloat = "left"; //IE
- div.stlye.cssFloat = "left"; //FF
jQuery.support.cssFloat 屬性返回true則表示可以使用cssFloat來(lái)設(shè)置float樣式. IE中返回false;
注意, 我們可以通過(guò)CSS()方法設(shè)置float樣式, jQuery內(nèi)部會(huì)自動(dòng)幫我們判斷是使用styleFloat還是cssFloat:
- $("#divResult").css("float","left"); //兼容IE和FF
#p#
四. 數(shù)組和對(duì)象操作
實(shí)現(xiàn)UI我們常常操作DOM對(duì)象或者jQuery包裝集, 但是實(shí)現(xiàn)算法或者業(yè)務(wù)邏輯時(shí)往往操作的是數(shù)組和對(duì)象.
下面講解最常用的數(shù)組和對(duì)象相關(guān)的工具函數(shù).
1.迭代
jQuery.each( object, callback )
返回值:Object
說(shuō)明:
通用例遍方法,可用于例遍對(duì)象和數(shù)組。
不同于例遍 jQuery 對(duì)象的 $().each() 方法,此方法可用于例遍任何對(duì)象?;卣{(diào)函數(shù)擁有兩個(gè)參數(shù):***個(gè)為對(duì)象的成員或數(shù)組的索引,第二個(gè)為對(duì)應(yīng)變量或內(nèi)容。如果需要退出 each 循環(huán)可使回調(diào)函數(shù)返回 false,其它返回值將被忽略。
講解:
對(duì)于jQuery包裝集我們可以使用each(callback)方法迭代包裝集中的每一個(gè)元素. callback是一個(gè)會(huì)函數(shù), 接受一個(gè)參數(shù)表示當(dāng)前訪問(wèn)對(duì)象的索引.
- $("img").each(function(i){
- this.src = "test" + i + ".jpg";
- });
對(duì)于數(shù)組我們可以使用 jQuery.each( object, callback ) 來(lái)遍歷, 這等同于使用for循環(huán).
注意傳入的***個(gè)參數(shù)可以是數(shù)組或者對(duì)象.如果數(shù)組,則遍歷數(shù)組中的每一個(gè)對(duì)象. ***個(gè)參數(shù)表示索引,第二個(gè)參數(shù)表示值, this表示當(dāng)前遍歷的元素, 可以通過(guò)返回false終止迭代, 比如下面的示例遍歷到第二個(gè)元素后會(huì)終止:
- $.each(["a", "b", "c"], function(i, n)
- {
- alert("Item #" + i + ": " + n);//可以獲取到i值
- if (i >= 1)
- {
- return false;
- }
- });
- $("#iterateArray").click(function(event)
- {
- var array = $.each(["a", "b", "c"], function(i, n)
- {
- alert("Item #" + i + ": " + n ); //***個(gè)參數(shù)i表示索引, this表示當(dāng)前遍歷的對(duì)象
- if (i >= 1)
- {
- return false;
- }
- });
- });
如果傳遞的是對(duì)象, 則遍歷對(duì)象的每一個(gè)屬性, 即使函數(shù)返回false也依然會(huì)遍歷完所有的屬性, ***個(gè)參數(shù)表示屬性key(屬性名稱,是obejct類型),第二個(gè)參數(shù)表示值,,this表示當(dāng)前屬性的值:
- $("#iterateObject").click(function(event)
- {
- $.each({ name: "ziqiu.zhang", sex: "male", status: "single" }, function(i, n)
- {
- alert("Item #" + i.toString() + ": " + n ); //***個(gè)參數(shù)i表示屬性的key(object), this表示屬性值
- if (i >= 1)
- {
- return false;
- }
- });
- });
each將是我們最常使用的函數(shù), 特別注意each雖然迭代每一個(gè)元素或?qū)傩? 但是在迭代函數(shù)中并不會(huì)改變當(dāng)前元素的值, 也就是無(wú)法改變返回后的對(duì)象.如果需要改變數(shù)組中的每一個(gè)元素并且將結(jié)果返回, 因使用jQuery.map( array, callback )函數(shù).
2.篩選
jQuery.grep( array, callback, [invert] )
返回值: Array
說(shuō)明:
使用過(guò)濾函數(shù)過(guò)濾數(shù)組元素。
此函數(shù)至少傳遞兩個(gè)參數(shù):待過(guò)濾數(shù)組和過(guò)濾函數(shù)。過(guò)濾函數(shù)必須返回 true 以保留元素或 false 以刪除元素。
講解:
默認(rèn)invert為false, 即過(guò)濾函數(shù)返回true為保留元素. 如果設(shè)置invert為true, 則過(guò)濾函數(shù)返回true為刪除元素.
下面的示例演示如何過(guò)濾數(shù)組中索引小于 0 的元素:
- $.grep( [0,1,2], function(n,i){
- return n > 0;
- });
返回的結(jié)果是[1,2]
3.轉(zhuǎn)換
jQuery.map( array, callback )
返回值:Array
說(shuō)明:
將一個(gè)數(shù)組中的元素轉(zhuǎn)換到另一個(gè)數(shù)組中。
作為參數(shù)的轉(zhuǎn)換函數(shù)會(huì)為每個(gè)數(shù)組元素調(diào)用,而且會(huì)給這個(gè)轉(zhuǎn)換函數(shù)傳遞一個(gè)表示被轉(zhuǎn)換的元素作為參數(shù)。轉(zhuǎn)換函數(shù)可以返回轉(zhuǎn)換后的值、null(刪除數(shù)組中的項(xiàng)目)或一個(gè)包含值的數(shù)組,并擴(kuò)展至原始數(shù)組中。
講解:
1.3.2版本中此函數(shù)和each函數(shù)已經(jīng)幾乎相同(以前稍有不同), 現(xiàn)在唯一的區(qū)別就是回調(diào)函數(shù)可以改變當(dāng)前元素.返回null則刪除當(dāng)前元素.
下面是幾個(gè)例子:
- var arr = [ "a", "b", "c", "d", "e" ]
- $("div").text(arr.join(", "));
- arr = jQuery.map(arr, function(n, i){
- return (n.toUpperCase() + i);
- });
- $("p").text(arr.join(", "));
- arr = jQuery.map(arr, function (a) { return a + a; });
- $("span").text(arr.join(", "));
4.合并
合并對(duì)象是我們常常編寫的功能, 通常使用臃腫的for循環(huán)來(lái)進(jìn)行.jQuery為我們提供了很多功能的合并函數(shù):
名稱 說(shuō)明 舉例 jQuery.extend( [deep], target, object1, [objectN] ) 用一個(gè)或多個(gè)其他對(duì)象來(lái)擴(kuò)展一個(gè)對(duì)象,返回被擴(kuò)展的對(duì)象。 如果不指定target,則給jQuery命名空間本身進(jìn)行擴(kuò)展。這有助于插件作者為jQuery增加新方法。
如果***個(gè)參數(shù)設(shè)置為true,則jQuery返回一個(gè)深層次的副本,遞歸地復(fù)制找到的任何對(duì)象。否則的話,副本會(huì)與原對(duì)象共享結(jié)構(gòu)。
為定義的屬性將不會(huì)被復(fù)制,然而從對(duì)象的原型繼承的屬性將會(huì)被復(fù)制。
合并 settings 和 options,修改并返回 settings:
var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);結(jié)果:
settings == { validate: true, limit: 5, name: "bar" }jQuery.makeArray( obj ) 將類數(shù)組對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象。 類數(shù)組對(duì)象有 length 屬性,其成員索引為 0 至 length - 1。實(shí)際中此函數(shù)在 jQuery 中將自動(dòng)使用而無(wú)需特意轉(zhuǎn)換。
將DOM對(duì)象集合轉(zhuǎn)換為數(shù)組:
var arr = jQuery.makeArray(document.getElementsByTagName("div"));jQuery.inArray( value, array ) 確定***個(gè)參數(shù)在數(shù)組中的位置,從0開(kāi)始計(jì)數(shù)(如果沒(méi)有找到則返回 -1 )。 查看對(duì)應(yīng)元素的位置:
var arr = [ 4, "Pete", 8, "John" ];
jQuery.inArray("John", arr); //3
jQuery.inArray(4, arr); //0
jQuery.inArray("David", arr); //-jQuery.merge( first, second ) 合并兩個(gè)數(shù)組 返回的結(jié)果會(huì)修改***個(gè)數(shù)組的內(nèi)容——***個(gè)數(shù)組的元素后面跟著第二個(gè)數(shù)組的元素。要去除重復(fù)項(xiàng),請(qǐng)使用$.unique()
合并兩個(gè)數(shù)組到***個(gè)數(shù)組上:
$.merge( [0,1,2], [2,3,4] )結(jié)果:
[0,1,2,2,3,4]jQuery.unique( array ) 刪除數(shù)組中重復(fù)元素。只處理刪除DOM元素?cái)?shù)組,而不能處理字符串或者數(shù)字?jǐn)?shù)組。 刪除重復(fù) div 標(biāo)簽:
$.unique(document.getElementsByTagName("div"));[
,, ...]講解:
上面的函數(shù)看著有些混亂. 看看我們以后會(huì)常用的.
首先是jQuery.merge( first, second ), 將兩個(gè)數(shù)組合并. 下面這個(gè)示例說(shuō)明如何使用此函數(shù):
jQuery Utilities - jQuery.merge - 合并數(shù)組
結(jié)果如圖:
另外不能因?yàn)橛辛薺Query就忘記我們的原始javascript. 比merge更常用的其實(shí)是join和split函數(shù).
merge函數(shù)會(huì)改變***個(gè)合并的數(shù)組, 如果是我設(shè)計(jì)我就不會(huì)這么做. 因?yàn)榉祷刂狄呀?jīng)是合并后的數(shù)組了.如此設(shè)計(jì)讓函數(shù)產(chǎn)生歧義.
列表中的那么多函數(shù)不再一一講解. 先用先查. 除了 jQuery.extend 這個(gè)不得不提的函數(shù). 下面單提一個(gè)小結(jié)講解.
5. jQuery.extend
在開(kāi)發(fā)插件的時(shí)候最常用此函數(shù)函數(shù)來(lái)處理options.
下面是fancybox插件獲取options的代碼:
- settings = $.extend({}, $.fn.fancybox.defaults, settings);
上面的代碼target是一個(gè)空對(duì)象, 將默認(rèn)設(shè)置defaults作為***個(gè)對(duì)象, 將用戶傳入的設(shè)置setting合并到default上, setting上有的屬性以setting為準(zhǔn). setting沒(méi)有傳入的屬性則使用default的默認(rèn)值. 然后將合并的結(jié)果復(fù)制給target并作為函數(shù)返回值返回.
看一個(gè)完整的示例:
- var empty = {}
- var defaults = { validate: false, limit: 5, name: "foo" };
- var options = { validate: true, name: "bar" };
- var settings = jQuery.extend(empty, defaults, options);
結(jié)果:
settings == { validate: true, limit: 5, name: "bar" }
empty == { validate: true, limit: 5, name: "bar" }
target參數(shù)要傳遞一個(gè)空對(duì)象是因?yàn)閠arget的值***將被改變.比如:
- var defaults = { validate: false, limit: 5, name: "foo" };
- var options = { validate: true, name: "bar" };
- var settings = jQuery.extend(defaults, options);
上面的代碼將defaults作為target參數(shù), 雖然***settings的結(jié)果一樣, 但是defaults的值被改變了! 而插件中的默認(rèn)值應(yīng)該都是固定! 所以使用時(shí)請(qǐng)注意target參數(shù)的用法.
下面是我的完整示例和結(jié)果:
jQuery Utilities - jQuery.extend - jQuery.extend(empty, defaults, options)
- jQuery.extend(defaults, options)
結(jié)果:
#p#
五. 測(cè)試工具函數(shù)
測(cè)試工具函數(shù)主要用于判斷對(duì)象是否是某一種類型, 返回的都是Boolean值:
jQuery.isArray( obj )
jQuery.isFunction( obj )
同時(shí)別忘記了javascript中自帶的isNaN和isFinite:
- var test = "123";
- alert(isNaN(test));
- alert(isFinite(test));
isNaN函數(shù)判斷參數(shù)是否是非數(shù)字. 如果是數(shù)字則返回false.isFinite函數(shù)檢查其參數(shù)是否是無(wú)窮大.如果參數(shù)是 NaN(非數(shù)字),或者是正、負(fù)無(wú)窮大的數(shù),則返回 false.否則返回true.
六. 字符處操作工具函數(shù)
目前核心類庫(kù)中只有一個(gè)字符串工具函數(shù):
jQuery.trim( str )
返回值:string
說(shuō)明:去掉字符串起始和結(jié)尾的空格。
舉例:
去掉字符串起始和結(jié)尾的空格:
- $.trim(" hello, how are you? ");
結(jié)果:
"hello, how are you?"
七. Url操作工具函數(shù)
jQuery.param( obj )
返回值:string
說(shuō)明:
將表單元素?cái)?shù)組或者對(duì)象序列化。是.serialize()的核心方法。
數(shù)組或jQuery對(duì)象會(huì)按照name/value對(duì)進(jìn)行序列化,普通對(duì)象按照key/value對(duì)進(jìn)行序列化
舉例:
- var params = { width:1680, height:1050 };
- var str = jQuery.param(params);
- $("#results").text(str);
結(jié)果:
width=1680&height=1050
jQuery將其歸為Urls分類, 因?yàn)榇朔椒ㄍǔS糜诎l(fā)送GET請(qǐng)求時(shí)將對(duì)象作為urls參數(shù)傳遞給服務(wù)端.
八. 擴(kuò)展工具函數(shù)與jQuery包裝集函數(shù)
擴(kuò)展工具函數(shù)只需要對(duì)jQuery(即"$")進(jìn)行擴(kuò)展. 通常開(kāi)發(fā)工具函數(shù)或者插件的人希望在開(kāi)發(fā)時(shí)使用"$", 但因?yàn)?$"有可能和其他腳本庫(kù)沖突, 所以通常我們使用下面的語(yǔ)法開(kāi)發(fā)工具函數(shù):
- (function($)
- {
- $.myExtendMethod = function(o)
- {
- alert(0);
- };
- })(jQuery);
在函數(shù)體內(nèi)的"$"能保證是代表jQuery對(duì)象.
然后使用這種方式開(kāi)發(fā)不能享受到智能感知的便利. 一般我們將擴(kuò)展工具函數(shù)和擴(kuò)展jQuery包裝集函數(shù)都放在一個(gè)單獨(dú)的文件中.
下面這個(gè)示例演示如何添加自定義的jQuery工具方法和jQuery包裝集方法:
通過(guò)***行reference, 我們可以在此js文件中繼續(xù)使用jQuery腳本智能感知. jQuery.myExtendMethod方法擴(kuò)展的工具函數(shù).jQuery.fn.myExtendMethod方法擴(kuò)展的是jQuery包裝集函數(shù), 即為使用$()獲取到的對(duì)象添加了方法.同理使用XML注釋, 比如
還可以為自定義方法添加智能感知提示.腳本中的XML注釋和.NET中的一樣, 有關(guān).NET中的XML注釋可以參考我的另外一篇文章:使用.NET中的XML注釋(一) -- XML注釋標(biāo)簽講解
九.總結(jié)
jQuery提供了許多的工具函數(shù), 在一般情況下可以滿足我們的需要. 但是對(duì)于像JSON格式化一類的操作, 需要我們自己擴(kuò)展, 現(xiàn)有的各種擴(kuò)展組件資源將提高我們的開(kāi)發(fā)效率, 本系列Ajax章節(jié)就介紹的一個(gè)JSON序列化的組件jQuery.json. 更多的組件需要大家在工作中挖掘.
【編輯推薦】
- 從零開(kāi)始學(xué)習(xí)jQuery之jQuery實(shí)施方案
- 從零開(kāi)始學(xué)習(xí)jQuery之讓頁(yè)面動(dòng)起來(lái)
- 從零開(kāi)始學(xué)習(xí)jQuery之Ajax快餐
- 從零開(kāi)始學(xué)習(xí)jQuery之管理jQuery包裝集
- jQuery從入門到精通
標(biāo)題名稱:從零開(kāi)始學(xué)習(xí)jQuery之必知的工具函數(shù)
鏈接分享:http://fisionsoft.com.cn/article/dhcpspc.html


咨詢
建站咨詢
