龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

从零开始学习jQuery之必知的工具函数(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
四. 数组和对象操作 实现UI我们常常操作DOM对象或者jQuery包装集, 但是实现算法或者业务逻辑时往往操作的是数组和对象. 下面讲解最常用的数组和对象相关

四. 数组和对象操作

实现UI我们常常操作DOM对象或者jQuery包装集, 但是实现算法或者业务逻辑时往往操作的是数组和对象.

下面讲解最常用的数组和对象相关的工具函数.

1.迭代

jQuery.each( object, callback )

返回值:Object

说明:

通用例遍方法,可用于例遍对象和数组。

不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象。回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容。如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。

讲解:

对于jQuery包装集我们可以使用each(callback)方法迭代包装集中的每一个元素. callback是一个会函数, 接受一个参数表示当前访问对象的索引.

  1. $("img").each(function(i){  
  2.    this.src = "test" + i + ".jpg";  
  3.  }); 

对于数组我们可以使用 jQuery.each( object, callback ) 来遍历, 这等同于使用for循环.

注意传入的第一个参数可以是数组或者对象.如果数组,则遍历数组中的每一个对象. 第一个参数表示索引,第二个参数表示值, this表示当前遍历的元素, 可以通过返回false终止迭代, 比如下面的示例遍历到第二个元素后会终止:

  1. $.each(["a""b""c"], function(i, n)  
  2. {  
  3.     alert("Item #" + i + ": " + n);//可以获取到i值  
  4.     if (i >= 1)  
  5.     {  
  6.         return false;  
  7.     }  
  8. });  
  9.  
  10.  
  11. $("#iterateArray").click(function(event)  
  12. {  
  13. var array = $.each(["a""b""c"], function(i, n)  
  14. {  
  15.     alert("Item #" + i + ": " + n ); //第一个参数i表示索引, this表示当前遍历的对象  
  16.     if (i >= 1)  
  17.     {  
  18.         return false;  
  19.     }  
  20. });  
  21. });  
  22.  

如果传递的是对象, 则遍历对象的每一个属性, 即使函数返回false也依然会遍历完所有的属性, 第一个参数表示属性key(属性名称,是obejct类型),第二个参数表示值,,this表示当前属性的值:

  1. $("#iterateObject").click(function(event)  
  2. {  
  3.     $.each({ name: "ziqiu.zhang", sex: "male", status: "single" }, function(i, n)  
  4.     {  
  5.         alert("Item #" + i.toString() + ": " + n ); //第一个参数i表示属性的key(object), this表示属性值  
  6.         if (i >= 1)  
  7.         {  
  8.             return false;  
  9.         }  
  10.     });  
  11. }); 

each将是我们最常使用的函数, 特别注意each虽然迭代每一个元素或属性, 但是在迭代函数中并不会改变当前元素的值, 也就是无法改变返回后的对象.如果需要改变数组中的每一个元素并且将结果返回, 因使用jQuery.map( array, callback )函数.

2.筛选

jQuery.grep( array, callback, [invert] )

返回值: Array

说明:

使用过滤函数过滤数组元素。

此函数至少传递两个参数:待过滤数组和过滤函数。过滤函数必须返回 true 以保留元素或 false 以删除元素。

讲解:

默认invert为false, 即过滤函数返回true为保留元素. 如果设置invert为true, 则过滤函数返回true为删除元素.

下面的示例演示如何过滤数组中索引小于 0 的元素:

  1. $.grep( [0,1,2], function(n,i){  
  2.   return n > 0;  
  3. }); 

返回的结果是[1,2]

3.转换

jQuery.map( array, callback )

返回值:Array

说明:

将一个数组中的元素转换到另一个数组中。

作为参数的转换函数会为每个数组元素调用,而且会给这个转换函数传递一个表示被转换的元素作为参数。转换函数可以返回转换后的值、null(删除数组中的项目)或一个包含值的数组,并扩展至原始数组中。

讲解:

1.3.2版本中此函数和each函数已经几乎相同(以前稍有不同), 现在唯一的区别就是回调函数可以改变当前元素.返回null则删除当前元素.

下面是几个例子:

  1. var arr = [ "a""b""c""d""e" ]  
  2. $("div").text(arr.join(", "));  
  3.  
  4. arr = jQuery.map(arr, function(n, i){  
  5.   return (n.toUpperCase() + i);  
  6. });  
  7. $("p").text(arr.join(", "));  
  8.  
  9. arr = jQuery.map(arr, function (a) { return a + a; });  
  10. $("span").text(arr.join(", ")); 

4.合并

合并对象是我们常常编写的功能, 通常使用臃肿的for循环来进行.jQuery为我们提供了很多功能的合并函数:

名称 说明 举例
jQuery.extend( [deep], target, object1, [objectN] ) 用一个或多个其他对象来扩展一个对象,返回被扩展的对象。

如果不指定target,则给jQuery命名空间本身进行扩展。这有助于插件作者为jQuery增加新方法。

如果第一个参数设置为true,则jQuery返回一个深层次的副本,递归地复制找到的任何对象。否则的话,副本会与原对象共享结构。

为定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。

合并 settings 和 options,修改并返回 settings:
var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);

结果:
settings == { validate: true, limit: 5, name: "bar" }

jQuery.makeArray( obj ) 将类数组对象转换为数组对象。

类数组对象有 length 属性,其成员索引为 0 至 length - 1。实际中此函数在 jQuery 中将自动使用而无需特意转换。

将DOM对象集合转换为数组:
var arr = jQuery.makeArray(document.getElementsByTagName("div"));
jQuery.inArray( value, array ) 确定第一个参数在数组中的位置,从0开始计数(如果没有找到则返回 -1 )。 查看对应元素的位置:
var arr = [ 4, "Pete", 8, "John" ];
jQuery.inArray("John", arr); //3
jQuery.inArray(4, arr); //0
jQuery.inArray("David", arr); //-
jQuery.merge( first, second ) 合并两个数组

返回的结果会修改第一个数组的内容——第一个数组的元素后面跟着第二个数组的元素。要去除重复项,请使用$.unique()

合并两个数组到第一个数组上:
$.merge( [0,1,2], [2,3,4] )

结果:
[0,1,2,2,3,4]

jQuery.unique( array ) 删除数组中重复元素。只处理删除DOM元素数组,而不能处理字符串或者数字数组。 删除重复 div 标签:
$.unique(document.getElementsByTagName("div"));

[<div>, <div>, ...]

讲解:

上面的函数看着有些混乱. 看看我们以后会常用的.

首先是jQuery.merge( first, second ), 将两个数组合并. 下面这个示例说明如何使用此函数:

  1. <html xmlns="http://www.w3.org/1999/xhtml">  
  2. <head>  
  3.     <title>jQuery Utilities - jQuery.merge</title>  
  4.  
  5.     <script src="../scripts/jquery-1.3.2-vsdoc2.js" type="text/javascript"></script>  
  6.  
  7.     <script type="text/javascript">  
  8.         $(function()  
  9.         {  
  10.             $("#go").click(function(event)  
  11.             {  
  12.                 $("#divResult").html("");  
  13.                 var first = [1, 3, 5];  
  14.                 $("#divResult").append("<span>first:[" + first.join(",") + "]</span>").append("<br/>");  
  15.                 var second = [2, 4, 6];  
  16.                 $("#divResult").append("<span>second:[" + second.join(",") + "]</span>").append("<br/>");  
  17.                 var result = $.merge(first, second);  
  18.                 $("#divResult").append("<span>result:[" + result.join(",") + "]</span>").append("<br/>");  
  19.                 $("#divResult").append("<span>first after merged:[" + first.join(",") + "]</span><br/>");  
  20.                 $("#divResult").append("<span>second after merged:[" + second.join(",") + "]</span><br/>");  
  21.  
  22.             });  
  23.         });         
  24.              
  25.     </script>  
  26.  
  27. </head>  
  28. <body>  
  29.     <button id="go">  
  30.         合并数组</button>  
  31.     <br />  
  32.     <div id="divResult">  
  33.     </div>  
  34. </body>  
  35. </html> 

结果如图:

image

另外不能因为有了jQuery就忘记我们的原始javascript. 比merge更常用的其实是join和split函数.

merge函数会改变第一个合并的数组, 如果是我设计我就不会这么做. 因为返回值已经是合并后的数组了.如此设计让函数产生歧义.

列表中的那么多函数不再一一讲解. 先用先查. 除了 jQuery.extend 这个不得不提的函数. 下面单提一个小结讲解.

5. jQuery.extend

在开发插件的时候最常用此函数函数来处理options.

下面是fancybox插件获取options的代码:

  1. settings = $.extend({}, $.fn.fancybox.defaults, settings); 

上面的代码target是一个空对象, 将默认设置defaults作为第一个对象, 将用户传入的设置setting合并到default上, setting上有的属性以setting为准. setting没有传入的属性则使用default的默认值. 然后将合并的结果复制给target并作为函数返回值返回.

看一个完整的示例:

  1. var empty = {}  
  2. var defaults = { validate: false, limit: 5, name: "foo" };  
  3. var options = { validate: true, name: "bar" };  
  4. var settings = jQuery.extend(empty, defaults, options); 

结果:

settings == { validate: true, limit: 5, name: "bar" }

empty == { validate: true, limit: 5, name: "bar" }

target参数要传递一个空对象是因为target的值最后将被改变.比如:

  1. var defaults = { validate: false, limit: 5, name: "foo" };  
  2. var options = { validate: true, name: "bar" };  
  3. var settings = jQuery.extend(defaults, options);  

上面的代码将defaults作为target参数, 虽然最后settings的结果一样, 但是defaults的值被改变了! 而插件中的默认值应该都是固定! 所以使用时请注意target参数的用法.

下面是我的完整示例和结果:

  1. <html xmlns="http://www.w3.org/1999/xhtml">  
  2. <head>  
  3.     <title>jQuery Utilities - jQuery.extend</title>  
  4.  
  5.     <script src="../scripts/jquery-1.3.2-vsdoc2.js" type="text/javascript"></script>  
  6.  
  7.     <script type="text/javascript">  
  8.         $.toObjectString = function (obj)  
  9.         {  
  10.             var result = "{";  
  11.             var counter = 0;  
  12.             $.each(obj, function(i, n)  
  13.             {  
  14.                 if (counter > 0) { result += ","; }  
  15.                 result += i.toString() + ":" + n.toString();  
  16.                 counter++;   
  17.             });  
  18.             result += "}";  
  19.             return result;  
  20.         }  
  21.  
  22.         $(function()  
  23.         {  
  24.             $("#go1").click(function(event)  
  25.             {  
  26.                 $("#divResult").html("");  
  27.  
  28.                 var empty = {}  
  29.                 var defaults = { validate: false, limit: 5, name: "foo" };  
  30.                 var options = { validate: true, name: "bar" };  
  31.  
  32.                 $("#divResult").append("<span>empty:" + $.toObjectString(empty) + "</span>").append("<br/>");  
  33.                 $("#divResult").append("<span>defaults:" + $.toObjectString(defaults) + "</span>").append("<br/>");  
  34.                 $("#divResult").append("<span>options:" + $.toObjectString(options) + "</span>").append("<br/>");                  
  35.                   
  36.                 var settings = jQuery.extend(empty, defaults, options);  
  37.                 $("#divResult").append("<span>settings after extend:" + $.toObjectString(settings) + "</span>").append("<br/>");  
  38.                 $("#divResult").append("<span>defaults after extend:" + $.toObjectString(defaults) + "</span>").append("<br/>");  
  39.                 $("#divResult").append("<span>options after extend:" + $.toObjectString(options) + "</span>").append("<br/>");  
  40.  
  41.             });  
  42.  
  43.             $("#go2").click(function(event)  
  44.             {  
  45.                 $("#divResult").html("");  
  46.  
  47.    
  48.                 var defaults = { validate: false, limit: 5, name: "foo" };  
  49.                 var options = { validate: true, name: "bar" };  
  50.                 $("#divResult").append("<span>defaults:" + $.toObjectString(defaults) + "</span>").append("<br/>");  
  51.                 $("#divResult").append("<span>options:" + $.toObjectString(options) + "</span>").append("<br/>");  
  52.                   
  53.                 var settings = jQuery.extend(defaults, options);  
  54.                 $("#divResult").append("<span>settings after extend:" + $.toObjectString(settings) + "</span>").append("<br/>");  
  55.                 $("#divResult").append("<span>defaults after extend:" + $.toObjectString(defaults) + "</span>").append("<br/>");  
  56.                 $("#divResult").append("<span>options after extend:" + $.toObjectString(options) + "</span>").append("<br/>");  
  57.  
  58.             });  
  59.         });         
  60.              
  61.     </script>  
  62.  
  63. </head>  
  64. <body>  
  65.     <button id="go1" style="height:40px;width:400px;">  
  66.         jQuery.extend(empty, defaults, options)</button>  
  67.     <button id="go2"  style="height:40px;width:400px;">  
  68.         jQuery.extend(defaults, options)</button>  
  69.     <br />  
  70.     <div id="divResult">  
  71.     </div>  
  72. </body>  
  73. </html> 

结果:

image

image

精彩图集

赞助商链接