jquery只要研究总结透彻了,那选择对象就会随心所欲,遍历数组更是易如反掌。选对对象,才能“娶妻生子”,才能有后续的数据处理。呵呵遍历对很关键。

怕只怕,学东西浅尝辄止一知半解。本篇特别研究总结jquery的遍历。

一、最大的遍历就是树遍历,还有就是遍历数组。树遍历主要有以下函数:
1、向上遍历 parent() parents() parentsUntil()
2、向下遍历 children() find()
3、同级遍历 siblings() next() nextAll()nextUntil() prev()prevAll()prevUntil()
4、遍历的检索与筛选,缩写搜索元素的范围
  三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素。
  其他过滤方法,比如 filter() 和 not() 允许您选取匹配或不匹配某项指定标准的元素。

另外:触发遍历通常结合click等绑定事件,通过某个ID来遍历。绑定事件有 .live() .delegate() .bind() .on()

$("a").live("click",function(){alert("ok");});
delegate(selector,[type],[data],fn) 指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数

$("#container").delegate("a","click",function(){alert("ok");})
on(events,[selector],[data],fn) 在选择元素上绑定一个或多个事件的事件处理函数

具体差别:
.bind()是直接绑定在元素上
.live()则是通过冒泡的方式来绑定到元素上的。更适合列表类型的,绑定到document DOM节点上。和.bind()的优势是支持动态数据。
.delegate()则是更精确的小范围使用事件代理,性能优于.live()
.on()则是最新的1.7版本整合了之前的三种方式的新事件绑定机制

具体用哪个需要根据场景来区别使用。

1.bind 是对具体的元素绑定具体的事件;
2.live,或者 delegate 是事件代理模式,在动态生成的将来元素中用bind 需要恰当的时机,而用代理则避免这个模式。还有代理会更高效。
bind()只能对已有的元素绑定事件,而.live()能对未来插入的元素绑定事件。live使用了冒泡方式来判断当前触发事件的对象,用的场景会少很多,相比bind有性能问题!
 
特别说明:
JQuery从1.7版本开始将bind(),live()和delegate()方法合并成了on()方法了
同样unbind(),die()和undelegate()方法也合并成了off()方法

二、数组遍历,使用最多的主要用each函数,或使用foreach ,for 来实现。
解析json串时要注意,是转成对象,还是数组。
//json串中全是{}罗列的,所以只能按对象来解析,[]这样可以按数组解析。
$json='{"return":"OK","questions":{"4":{"qid":"4","title":"\u95ee\u989844444","answers":{"14":{"cid":"14","title":"A","cont":"\u7b54\u68484-1","iscorrect":"1","qid":"4"},"15":{"cid":"15","title":"B","cont":"\u7b54\u68484-2","iscorrect":"0","qid":"4"},"16":{"cid":"16","title":"C","cont":"\u7b54\u68484-3","iscorrect":"0","qid":"4"}}},"2":{"qid":"2","title":"\u95ee\u98982222","answers":{"5":{"cid":"5","title":"A","cont":"\u7b54\u68482-1","iscorrect":"1","qid":"2"},"6":{"cid":"6","title":"B","cont":"\u7b54\u68482-2","iscorrect":"0","qid":"2"},"7":{"cid":"7","title":"A","cont":"aa","iscorrect":"0","qid":"2"},"8":{"cid":"8","title":"D","cont":"\u7b54\u68482-4","iscorrect":"0","qid":"2"}}}}}';
//php中一定要注意true的使用,When true, returned objects will be converted into associative arrays.
$arr=json_decode($json,true);
在js脚本中是这个样子的
var jn=jQuery.parseJSON(data,true);

例子1:each处理一维数组
var arr1 = [ "aaa", "bbb", "ccc" ];
$.each(arr1, function(i,val){
    alert(i);
    alert(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']

例子3:遍历对象数组
$("#ID")返回的是一个对象,因为ID唯一
$(".className"),Find()等返回一般是个集合,或者说是个JQ对象数组
html中数据
<dl id="menu_title">
    <dt>人</dt> <dd> 一种高级动物</dd>
           <dt>狗</dt> <dd>  人类的朋友</dd>
           <dt>猫</dt> <dd>  猫科动物的祖先</dd>
</dl>

//js取对象集合并遍历
var jqArr = $("#menu_title").find("dt");
      jqArr.each(function (i, o) {
                console.log("第" + i + "号元素的内容是:" + $(o).html());
 });
      
$.each(function(i,o){});
方法中的i表示JQ数组的索引值,而o表示JQ数组的值,而o加上$()变成JQ对象之后,使用html()这个方法可以输出o这个对象里的内容;JQ产生的数组的索引也是从0开始的。

例子4:遍历复杂的json串
(1)、json串不规范的{}大括号连环套的要解析成object ,也就是var jn=jQuery.parseJSON(data,true);

            data='{"return":"OK","questions":{"4":{"qid":"4","title":"\u95ee\u989844444","answers":{"14":{"cid":"14","title":"A","cont":"\u7b54\u68484-1","iscorrect":"0","qid":"4"},"15":{"cid":"15","title":"B","cont":"\u7b54\u68484-2","iscorrect":"1","qid":"4"},"16":{"cid":"16","title":"C","cont":"\u7b54\u68484-3","iscorrect":"0","qid":"4"}}},"2":{"qid":"2","title":"\u95ee\u98982222","answers":{"5":{"cid":"5","title":"A","cont":"\u7b54\u68482-1","iscorrect":"0","qid":"2"},"6":{"cid":"6","title":"B","cont":"\u7b54\u68482-2","iscorrect":"0","qid":"2"},"7":{"cid":"7","title":"A","cont":"aa","iscorrect":"0","qid":"2"},"8":{"cid":"8","title":"D","cont":"\u7b54\u68482-4","iscorrect":"0","qid":"2"}}}}}';

            var jn=jQuery.parseJSON(data,true);
var qs=jn.questions;
if(jn.return!=null&&jn.return=='OK'){
$.each( qs , function(property1,value1){
// console.log("属性名1=" + property1 + "; 属性值1=" + value1);
$.each( value1 , function(property2, value2){
//console.log("--属性名2=" + property2 + "; 属性值2=" + value2);
if(property2=="qid") qid=value2;
if(property2=="title") qtitle=value2;
if(property2=="title") {
//console.log("--属性名2=" + property2 + "; 属性值2=" + value2+" qid:"+qid +" qtitle:"+ qtitle );
$("#datalist").append(
"<div class='a32 str'>"+ qid+" "+qtitle+"</div>"+
"<div class='a33'><input type='hidden' name='t"+qid+"' id='t"+qid+"' value='"+qid+"_0'>"+
"<div>"
);
}
if(property2=='answers'){
$.each( value2, function(property3, value3){
$.each( value3, function(property4, value4){
//console.log("------属性名4=" + property4 + "; 属性值4=" + value4);
if(property4=="cid") cid=value4;
if(property4=="title") ctitle=value4;
if(property4=="cont") cont=value4;
} );
// console.log("----属性名3=" + property3 + "; 属性值3=" + value3+" cid:"+cid +" ctitle:"+ ctitle +" cont:"+cont);
$("#datalist").append( "<div class='a331 t"+qid+"' id='"+qid+"_"+cid+"'><span class='radio"+qid+"'></span></div>"+
"<div class='a332 str'>"+" cid:"+cid +" "+ ctitle +" "+cont+"</div>"+
"<div class='cls'></div></div>"); } );
$("#datalist").append("</div>");
};
// $("#datalist").append("</div>");
} ); } ); }else{
//alert("失败!");
}

(2)、json串规范的是[]中括号就直接遍历,var jn=jQuery.parseJSON(data);//不用加true
                var jn=jQuery.parseJSON(data);
                //jn.userlist 就是[]列表数据
         $.each(jn.userlist, function(i, item) {                
                         $("#datalist").append(
                               "<div class='a53'>"+
                                    "<div class='a531 fl str'>"+(i+1)+"</div>"+
                                    "<div class='a532 fl str'>"+item.unick+"</div>"+
                                    "<div class='a533 fl str'>"+item.speed+"s</div>"+
                                    "<div class='a534 fl str'>"+item.corrects+"/"+jn.total+"</div>"+
                                    "<div class='cls'></div>"+
                                "</div>"
                       );               
                        
                            }
                   );

jquery 选择对象随心所欲,遍历数组更是易如反掌的更多相关文章

  1. 原生js使用forEach()与jquery使用each遍历数组,return false 的区别

    原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24]; $.e ...

  2. jQuery中使用$.each()遍历数组时要注意的地方

    使用jQuery中 $.each()遍历数组,要遍历的数组不能为空(arry!="") 例如:           $.each(arry, function (i, item)  ...

  3. jquery 遍历 数组1

    使用了jquery有段时间了,整理下jquery中的遍历问题. 1.jquery 遍历对象 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Tr ...

  4. jquery中each遍历对象和数组示例

    通用遍历方法,可用于遍历对象和数组.$().each(),回调函数拥有两个参数: 第一个为对象的成员或数组的索引,第二个为对应变量或内容.如需退出each循环可使回调函数返回false 现有如下两个s ...

  5. Jquery遍历数组之$().each()方法和$.each()方法

    前几天面试碰到了一个笔试问题:用jquery变了数组. 总结一下用jquery遍历数组的两种方法: 一.$().each()方法 <head><meta http-equiv=&qu ...

  6. js和jquery中的遍历对象和数组(forEach,map,each)

    arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项,index当前项的索引,array原始数组: ...

  7. jquery (内置遍历数组的函数,事件)

    内置遍历数组的函数: 1. $.map(array, function() { }); 取到数组或者对象array中每一项进行遍历  然后在function中处理: var attr = [1,2,3 ...

  8. jquery中each遍历各种标签方法

    这写天用到的遍历jquery each方法比较频繁 刚好有时间,就在这里记录一下 jquery用的是bootstrap的线上文件 不需要导入 <!DOCTYPE html><html ...

  9. Java基础(6):foreach 方法遍历数组

    foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是“ for 每一个”的意思,那 ...

随机推荐

  1. HDU.2829.Lawrence(DP 斜率优化)

    题目链接 \(Description\) 给定一个\(n\)个数的序列,最多将序列分为\(m+1\)段,每段的价值是这段中所有数两两相乘的和.求最小总价值. \(Solution\) 写到这突然懒得写 ...

  2. [__NSArrayM insertObject:atIndex:]: object cannot be nil'

    错误描述:如下图 分析原因: 1.插入的对象为空了 2.[__NSSetM addObject:] object cannot be nil [__NSArrayM insertObject:atIn ...

  3. CocosCreator项目结构

    1,通过 Dashboard,我们可以创建一个 Hello World 项目作为开始,创建之后的项目有特定的文件夹结构.[参考来源:官方文档] 2,初次创建并打开一个 Cocos Creator 项目 ...

  4. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  5. react-native学习资源

    转载链接:  http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-learning-resources/ 这是 ...

  6. SQLite日期时间函数

    SQLite日期时间函数 SQLite支持以下五个日期时间函数: date(timestring, modifier, modifier, …) time(timestring, modifier, ...

  7. shell基础语法以及监控进程不存在重新启动

    转码 # dos2unix ./test.sh 权限 # chmod a+x ./test.sh 语法变量var="111"echo $varecho ${var} 运算no1=4 ...

  8. 五种常见的ASP.NET安全缺陷

    保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(SystemsSciencesInstitute) ...

  9. SSL介绍(Secure socket Layer & Security Socket Layer)

    一个应用程序的安全需求在很大程度上依赖于将如何使用该应用程序和该应用程序将要保护什么.不过,用现有技术实现强大的. 一般用途的安全通常是可能的.认证就是一个很好的示例. 当顾客想从 Web 站点购买某 ...

  10. 基于ubuntu搭建 Discuz 论坛

    系统要求:Ubuntu 16.04.1 LTS 64 位操作系统 安装 Apache2 ubuntu 需要安装 Apache2 ,使用 apt-get 安装 Apache2(安装好后,您可以通过访问实 ...