ex-7.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <script type="text/javascript" src="scripts/jquery-1.4.2.js"></script> <script type="text/javascript"> function replaceElement(ele1, ele2) { var $ele1Temp = $(ele1).clone(true) ; var $ele2Temp = $(ele2).clone(true) ; $(ele1).replaceWith($ele2Temp) ; $(ele2).replaceWith($ele1Temp) ; } //需求: 点击 city 节点的任何 li 节点都能完成如下功能: 替换为 game 相应索引的节点; 反之亦然 $(function(){ //为每一个 li 节点增加 index 属性 /** * $("li") 这里返回的是一个数组!,那么问题就来了! * 为什么在$("li").click(...)增加方法的时候,没有使用each()这个方法呢? * 这是因为给每一个 li 节点增加的是相同的方法(看清楚是相同的),是不需要用each()这个方法的 * 可是这里是在给每一个 li 节点类型的增加一个索引, 从而使每一个 li 节点与其他的不同!(看清楚这个说的是不同!) * 所以就使用了each()这个方法 * */ $("li").each(function(i){ //这里的 i 是each()方法默认自带的!可以理解是这个标签数组的索引 //alert("0000") ; $(this).attr('index', i) ; //alert('111') ; $(this).click(function() { //获取 index 属性值 var index = $(this).attr('index') ; //设置与 index 相交换的那个对象的 索引 var targetIndex = 0 ; if(index < 4) { targetIndex = parseInt(index) + 4 ; }else { targetIndex = parseInt(index) - 4 ; } var target = $("li").get(targetIndex) ; //alert($(this).attr('index')) ; /* 这里应该注意一个小小的问题!仔细的看一下下面两行代码! 说白了就是-->在元素还没有交换之间先将 index 的属性值交换了! 为什么要在没有交换属性之前先将 index 的属性值交换呢? 这是因为属性值的交换和元素整体的交换是不一样的!前者是部分交换而后者是整体交换 在这里首先先交换属性值是为了为后面整体交换做准备! 并且也为任意两个节点相互交互(这里说的是相互交换而不是单向交换)做准备! */ $(this).attr('index', targetIndex) ; $(target).attr('index', index) ; //这里就是元素的整体交换 replaceElement(this, target) ; }) ; }) ; }) ; </script> </head> <body> <p> 你喜欢哪个城市? </p> <ul id="city"> <li id="bj" name="BeiJing"> 北京 </li> <li> 上海 </li> <li> 东京 </li> <li> 首尔 </li> </ul> <br> <br> <p> 你喜欢哪款单机游戏? </p> <ul id="game"> <li id="rl"> 红警 </li> <li> 实况 </li> <li> 极品飞车 </li> <li> 魔兽 </li> </ul> </body> </html>