zoukankan      html  css  js  c++  java
  • jQuery学习之旅 Item6 好用的each()

    1、javascript 函数的调用方式

    首先来研究一下jquery的each()方法的源码,在这之前,先要回顾一下javascript函数具体调用样式:

    1. 普通函数调用 setName();
    2. 可以作为对象的属性调用
    3. 作为构造函数使用,new 函数,实例化对象
    4. call() apply()
     //1、函数作为对象成员使用
        var cat = {'climb':function(){alert('zai pa shu')}};
        //cat.climb();
    
    
        //2、函数作为构造方法使用
        function Person(){
            this.name = "abc";
            this.run = function(){alert('running');}
        }
        var tom = new Person;
        console.log(tom.name);//abc 

    同一个函数可以被两个变量来调用:getName和tom.say

    
        //3、call()和apply()方法
        var name = "china";//    function getName(){
            //this:谁调用该函数,this就代表谁
            return this.name;
        }
        //console.log(window.getName());//undefined [china]
    
        var name = "china";
        function getName(a,b){
            var name = "xiaoqiang";
            //this:谁调用该函数,this就代表谁
            return this.name+a+b;
        }
        //console.log(getName());//xiaoqiang [china]
    
        var tom = {'name':'tom'}
        tom.say = getName;//把getName的引用赋值给say属性
        //alert(tom.say()); //tom
    
    
        //getName.call(对象,参数,参数);
        //函数执行中。内部this指引tom
        alert(getName.call(tom));  //函数执行方式
        var black = {'name':"xiaohei"}
        alert(getName.call(black,'hello','world'));  //xiaohei
    
        alert(getName.apply(black,['china','USA']));

    2、jQuery each()源码分析

    看下jQuery中的each实现:

    function (object, callback, args) {
        //该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args
        var name, i = 0,length = object.length;
        if (args) {
            if (length == undefined) {
                for (name in object) {
                    if (callback.apply(object[name], args) === false) {
                        break;
                    }
                }
            } else {
                for (; i < length;) {
                    if (callback.apply(object[i++], args) === false) {
                        break;
                    }
                }
            }
        } else {
            if (length == undefined) {
                for (name in object) {
                    if (callback.call(object[name], name, object[name]) === false) {
                        break;
                    }
                }
            } else {
                for (var value = object[0]; i < length && callback.call(value, i, value) !==
                    false; value = object[++i]) {}  
            }
        }
        return object;
    }
    //object[0]取得jQuery对象中的第一个DOM元素,通过for循环,
    //得到遍历整个jQuery对象中对应的每个DOM元素,通过 callback.call( value,i,value);
    //将callback的this对象指向value对象,并且传递两个参数,i表示索引值,value表示DOM元素;
    //其中callback是类似于 function(index, elem) { ... } 的方法。
    //所以就得到 $("...").each(function(index, elem){ ... });
    

    分析结果:each()有两种形式,

    1、 $(“li”).each(function(){}); ——> 调用的是jQuery.fn.init的方法(继承)

    2、$.each(数组/对象, function(){}) ——> 调用的是jQuery的方法(继承)

    3、 第一个each是对第二个each的封装 ;

    4、 最后执行的都是第二个each。两种方法本质是一样。

    3、 each()方法具体使用

    each()方法能使DOM循环结构简洁,不容易出错。each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组、多维数组、DOM, JSON 等等
    在javaScript开发过程中使用$each可以大大的减轻我们的工作量。

    下面提一下each的几种常用的用法

    1、each处理一维数组

      var arr1 = [ "aaa", "bbb", "ccc" ];      
      $.each(arr1, function(i,val){      
          alert(i);   //i为数组索引值  
          alert(val);  //val为具体的值
      });   

    alert(i)将输出0,1,2
    alert(val)将输出aaa,bbb,ccc

    2、each处理二维数组

      var arr2 = [['a', 'aa', 'aaa'], ['b', 'bb', 'bbb'], ['c', 'cc', 'ccc']]      
      $.each(arr2, function(i, item){      
          alert(i);   
          alert(item);      
      }); 

    arr2为一个二维数组,item相当于取这二维数组中的每一个数组。
    item[0]相对于取每一个一维数组里的第一个值
    alert(i)将输出为0,1,2,因为这二维数组含有3个数组元素
    alert(item)将输出为 [‘a’, ‘aa’, ‘aaa’],[‘b’, ‘bb’, ‘bbb’],[‘c’, ‘cc’, ‘ccc’]

    对此二位数组的处理稍作变更之后

     var arr = [['a', 'aa', 'aaa'], ['b', 'bb', 'bbb'], ['c', 'cc', 'ccc']]      
       $.each(arr, function(i, item){      
            $.each(item,function(j,val){
                alert(j);
                alert(val);
         }); 
    });    

    alert(j)将输出为0,1,2,0,1,2,0,1,2
    alert(val)将输出为a,aa,aaa,b,bb,bbb,c,cc,ccc

    3、each处理json数据

    这个each就有更厉害了,能循环每一个属性
      

    var obj = { one:1, two:2, three:3};      
       each(obj, function(key, val) {      
            alert(key); //key为属性名  
            alert(val); //val为属性值
       });   

    这里alert(key)将输出one two three
    alert(val)将输出one,1,two,2,three,3
    这边为何key不是数字而是属性呢,因为json格式内是一组无序的属性/值,既然无序,又何来数字呢。
    而这个val等同于obj[key]

    4、ecah处理dom元素

    此处以一个input表单元素作为例子。
    如果你dom中有一段这样的代码

    <input name="aaa" type="hidden" value="111" />
    <input name="bbb" type="hidden" value="222" />
    <input name="ccc" type="hidden" value="333" />
    <input name="ddd" type="hidden"  value="444"/>
    然后你使用each如下
     $.each($("input:hidden"), function(i,val){  
         alert(val);//val这里是获得的DOM对象
         alert(i);//Dom对象的索引
         alert(val.name);
         alert(val.value);   
     });  

    那么,alert(val)将输出[object HTMLInputElement],因为它是一个表单元素。
    alert(i)将输出为0,1,2,3
    alert(val.name);将输出aaa,bbb,ccc,ddd,如果使用this.name将输出同样的结果
    alert(val.value); 将输出111,222,333,444,如果使用this.value将输出同样的结果

    如果将以上面一段代码改变成如下的形式

    $("input:hidden").each(function(i,val){
        alert(i);
        alert(val.name);
        alert(val.value);       
    });

    可以看到,输出的结果是一样的,个人建议:操作DOM 用第二种语义上更好理解。

    这样,几个例子的实际结果已经得到答案。接着再继续往下研究,总不能知其然不知其所以然。
    从以上的例子中可知$和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给$的each方法。

    版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226

  • 相关阅读:
    windows cmd 中获取当前时间并输出此时间
    使用windows批处理来让git每日自动更新代码
    拒绝垃圾文章 在 ejabberd 中使用 MySQL
    IOS调试lldb命令常用,po,
    IOS 多语言本地化 完美解决方案
    [转]Xcode封装.Bundle文件
    百度地图SDK引用问题 Symbol(s) not found for architecture armv64
    loaded the "ViewController" nib but the view outlet was not set. 处理方式
    initWithFrame 和 initWithCoder
    使用IB_DESIGNABLE与IBInspectable特性实现可在视图编辑器的功能栏中设置
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4948190.html
Copyright © 2011-2022 走看看