jQuery之排序组件的深入解析


Posted in Javascript onJune 19, 2013

1:排序(Sortable)组件可以将页面上的一组元素变成可排序的,可用于定义一个可排序的元素列表,然后,通过拖动鼠标可以调整元素在列表中的位置
$('.selector').sortable(options);   
简单实例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sortable组件</title>
<script language="javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.mouse.js"></script>
<script type="text/javascript" src="js/jquery.ui.sortable.js"></script>
<link href="CSS/base/jquery.ui.all.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body {
 text-align:center;
 margin:0 auto;
 padding:0;
}
#wrap {
 margin: 10px auto 10px auto;
 padding: 5px;
 width: 450px;
 height:300px;
 background: #fff;
 border: 5px solid #000;
}
h1 {
 color:#006;
 font-size:24px;
 font-weight:bold;
 margin-bottom:2px;
 text-align:center;
}
#sortable {
 list-style-type: none;
 margin: 0;
 padding: 0;
 width: 100%;
}
#sortable li {
 margin: 3px;
 padding: 0.4em;
 font-size: 16px;
 height: 18px;
}
#sortable li span {
 position: absolute;
 margin-left: -1.3em;
}
</style>
<script type="text/javascript">
 $(document).ready(function(){
  $("#sortable").sortable();    //将sortable变成可排序的
  $("#sortable").disableSelection();  //使文本不可被选中
 });
</script>
</head>
<body>
<div id="wrap">
  <h1>拖动鼠标调整下列选项的顺序</h1>
  <ul id="sortable">
    <li class="ui-widget-content">星期一</li>
    <li class="ui-widget-content">星期二</li>
    <li class="ui-widget-content">星期三</li>
    <li class="ui-widget-content">星期四</li>
    <li class="ui-widget-content">星期五</li>
    <li class="ui-widget-content">星期六</li>
    <li class="ui-widget-content">星期七</li>
  </ul>
</div>
</body>
</html>

效果图:
   jQuery之排序组件的深入解析
2:关联排序列表
通常将两个以上的列表同时进行排序称为关联排序列表,利用属性connectWidth属性设置一个选择符,这样就可以指定在不同的列表之间移动元素的顺序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sortable组件</title>
<script language="javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.mouse.js"></script>
<script type="text/javascript" src="js/jquery.ui.sortable.js"></script>
<link href="CSS/base/jquery.ui.all.css" rel="stylesheet" type="text/css" />
<style type="text/css">
.message_box {
 width:180px;
 height:200px;
 filter:dropshadow(color=#666666, offx=3, offy=3, positive=2);
 float:left;
 margin-right:10px;
}
#mask {
 position:absolute;
 top:0;
 left:0;
width:expression(body.clientWidth);
height:expression(body.clientHeight);
 background:#666;
 filter:ALPHA(opacity=60);
 z-index:1;
 visibility:hidden
}
.message {
 border:#036 solid;
 border-width:1 1 3 1;
 width:95%;
 height:95%;
 color:#036;
 font-size:12px;
 line-height:150%;
 background:#FFF
}
.header {
 background:#036;
 height:22px;
 font-family:Verdana, Arial, Helvetica, sans-serif;
 font-size:12px;
 padding:3px 5px 0px 10px;
 color:#fff;
 cursor:move;
}
ul {
 margin-left:10px;
 margin-right:10px;
 background: #eee;
 padding: 5px;
 width: 150px;
}
li {
 font-size:14px;
}
.header div {
 display:inline;
 width:150px;
}
.header span {
 float:right;
 display:inline;
 cursor:hand;
}
.file, .folder {
 width: 60px;
 float: left;
 margin-right: 10px;
}
.file em, .folder em {
 clear: both;
 font-size: 12px;
 font-style: normal;
 text-decoration: underline;
}
.droppable {
 height:200px;
 overflow: auto;
}
#res {
 clear:both
}
</style>
<script type="text/javascript">
$(document).ready(function(){
 var msg = "";
 function callback(e, ui) {  
  if (e.type == "sortstart") {
   msg = "你选择了游戏:" + ui.item.text();
   $("#res").empty();
  } else if (e.type == "sortremove") {
   msg += ",从列表" + e.target.id;
  } else if (e.type == "sortreceive") {
   msg += "移至列表" + e.target.id + "。";
  } else if (e.type == "sortstop") {
   $("#res").append(msg);
  }
 }
 $("ul").sortable({  
  connectWith: "ul",
  start: callback,
  remove: callback,
  receive: callback,
  stop: callback
 }).disableSelection();
 $("#sortable2").sortable({ "dropOnEmpty":false});
});
</script>
</head>
<body>
<div id="message_box1" class="message_box" >
  <div class="message" >
    <div class="header">
      <div>休闲类小游戏</div>
      <span>×</span></div>
    <ul id="sortable1">
      <li>菠萝蛋糕 </li>
      <li>人品计算器 </li>
      <li>我的恐怖小屋</li>
      <li>品茗闻香话茶道 </li>
      <li>暴打火柴人中文版</li>
    </ul>
  </div>
</div>
<div id="message_box1" class="message_box" >
  <div class="message" >
    <div class="header">
      <div>动作类小游戏</div>
      <span>×</span></div>
    <ul id="sortable2">
      <li>奥特曼之狼人传说 </li>
      <li>企鹅战斗机 </li>
      <li>月蚀之刃</li>
      <li>终极拳皇 </li>
      <li>大满贯决赛 </li>
    </ul>
  </div>
</div>
<div id="message_box1" class="message_box" >
  <div class="message" >
    <div class="header">
      <div>精品游戏</div>
      <span>×</span></div>
    <ul id="sortable3">
    </ul>
  </div>
</div>
<div id="res"></div>
</body>
</html>

效果图:
jQuery之排序组件的深入解析

3:排序组件的方法 
3.1 serialize方法:
该方法可以将可排序元素的id属性序列化为一个可提交的表单或者Ajax字符串,语法格式如下:
    $("#sortable").sortable(serialize", [options]);
3.2 toArray方法:该方法将可排序元素的id序列化为一个字符串数组,语法格式如下:
    $("#sortable").sortable("toArray");
3.3 refresh方法:方法用于刷新可排序列表
    $("#sortable").sortable("refresh");
3.4 refreshPositons方法:该方法用于刷新可排序元素的缓存位置,语法格式如下:
    $("#sortable").sortable("refreshPositions");
3.5 cancel:方法用于取消当前可排序对象中元素的顺序改变
    $("#sortable").sortable("cancel");

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sortable组件</title>
<script language="javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.mouse.js"></script>
<script type="text/javascript" src="js/jquery.ui.sortable.js"></script>
<link href="CSS/base/jquery.ui.all.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body {
 text-align:left;
 margin:0 auto;
 padding:0;
}
#wrap {
 margin: 10px auto 10px auto;
 padding: 5px;
 width: 380px;
 height:330px;
 background: #fff;
 border: 5px solid #000;
 float: left;
}
#result {
 margin: 10px;
 padding: 2px;
 width: 470px;
 height:330px;
 background: #fff;
 border: 1px solid #999;
 float: left;
}
h1 {
 color:#006;
 font-size:24px;
 font-weight:bold;
 margin-bottom:2px;
 text-align:center;
}
#sortable, #connect {
 list-style-type: none;
 margin: 0;
 padding: 0;
 width: 100%;
}
#sortable li, #connect li {
 margin: 3px;
 padding: 0.4em;
 font-size: 16px;
 height: 18px;
}
</style>
<script type="text/javascript">
 $(document).ready(function(){
  $("#sortable").sortable({connectWith: '#connect'});
  $("#connect").sortable();
  $("#sortable").disableSelection();
  $("#btn").click(function(){
   var result = $("#sortable").sortable('serialize', {
    connected: true,
    attribute: 'att', 
    key: 'att', 
    expression: /^(?:sort_)(.+)$/
    });
   $('#msg').html($('#msg').html() + result + '<br />');
  });
 });
</script>
</head>
<body>
<div id="wrap">
  <h1>调整下列课程的安排顺序</h1>
  <ul id="sortable">
    <li class="ui-widget-content" att="sort_1.1">1.1 链接外部.JS文件</li>
    <li class="ui-widget-content" att="sort_1.2">1.2 使用Microsoft脚本编辑器</li>
    <li class="ui-widget-content" att="sort_1.3">1.3 使用while循环</li>
    <li class="ui-widget-content" att="sort_1.4">1.4 使用for循环</li>
  </ul>
  <ul id="connect">
    <li class="ui-widget-content" att="sort_2.1">2.1 使用Switch语句</li>
    <li class="ui-widget-content" att="sort_2.2">2.2 使用Array对象属性</li>
    <li class="ui-widget-content" att="sort_2.3">2.3 使用String对象的方法</li>
    <li class="ui-widget-content" att="sort_2.4">2.4 使用Date对象的方法</li>
  </ul>
</div>
<div id="result">
  <input type="button" name="button" id="btn" value="确认修改" />
  <p id="msg"></p>
</div>
</body>
</html>

效果图:    jQuery之排序组件的深入解析

这里将att作为键,值为布局中用att定义的字符串。           
4:排序时间回调函数
可以通过定义回调函数来更灵活的控制排序操作
4.1 start: 事件类型为sortstart, 在开始排序时触发
4.2 sort: 事件类型为sort, 在排序过程中触发
4.3 change:事件类型为sortchange, 在排序过程中,当元素的位置发生改变时触发
4.4 beforestop: 事件类型为sortbeforestop,当停止排序但占位符或者辅助元素仍然可用时触发
4.5 stop:事件类型为sortstop,当排序过程停止时触发
4.6 update: 事件类型为sortupdate, 当停止排序过程且元素位置已经发生变化时触发
4.7 receive: 事件类型为sortreceive,当连接的排序列表已从另一个列表接收到一个元素时触发
4.8 remove: 事件类型为sortremove, 当从列表中移出一个可排序元素并将其放置到另一个列表时触发
4.9 over: 事件类型为sortover, 当一个可排序元素被移动到另一个连接列表中时触发
4.10 out: 事件类型为sortout, 当一个可排序元素被移出连接列表时触发
4.11 activate: 事件类型为sortactivate, 当使用连接的排序列表时触发,每个连接列表在拖动开始时均接收此事件
4.12 deactivate: 事件类型为sortdeactivate, 当停止排序操作时触发,此事件将传播到所有可能的连接列表

  $("#droppable").droppable({
      eventName: function(event, ui) {
      }
}); 

ui是一个包含附加信息的jQuery对象,该jQuery对象具有一下属性
helper:
一个jQuery对象,表示当前要排序的元素
position: 一个包含top属性和left属性的对象,表示当前元素相对于原始对象的位置
offset:  一个包含top属性和left属性的对象,表示当前元素相对于页面的绝对位置
item: 表示当前拖动的jQuery对象
placeholder: 表示定义的占位符
sender: 当前拖动元素所属的排序列表,仅适用于两个列表之间移动的情况
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sortable组件</title>
<script language="javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.mouse.js"></script>
<script type="text/javascript" src="js/jquery.ui.sortable.js"></script>
<link href="CSS/base/jquery.ui.all.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body {
 text-align:left;
 margin:0 auto;
 padding:0;
}
#wrap {
 margin: 10px auto 10px auto;
 padding: 5px;
 width: 300px;
 height:250px;
 background: #fff;
 border: 5px solid #000;
 float: right;
 overflow:scroll;
}
h1 {
 color:#006;
 font-size:24px;
 font-weight:bold;
 margin-bottom:2px;
 text-align:left;
}
#sortable {
 list-style-type: none;
 margin: 0;
 padding: 0;
 width: 300px;
 float: left;
}
#sortable li {
 margin: 3px;
 padding: 0.4em;
 font-size: 14px;
 height: 18px;
 text-align: left;
}
#sortable li span {
 position: absolute;
 margin-left: -1.3em;
}
#result {
 clear:both;
}
</style>
<script type="text/javascript">
 $(document).ready(function(){
  $("#sortable").sortable({
   cursor:"move",
   start:eventCallback,
   sort:eventCallback,
   stop:eventCallback,
   change:eventCallback,
   beforeStop:eventCallback,
   update:eventCallback,
  });
 function eventCallback(e, ui) {
  var content = "事件类型:" + e.type + "<br/>";
  var message = $("<span>").text(content);
  $("#wrap").append(content);
  var pos = $(".ui-widget-content").index(ui.item) + 1;
  if (e.type == "sortstart") {
   msg = "元素: " + ui.item.text() + ";排序前位置:" + pos;
  } else if (e.type == "sortstop") {
   msg += ";排序后位置:" + pos;
  }
  $("#result").text(msg);
 }
 $("#sortable").disableSelection();
 });
</script>
</head>
<body>
<h1>改变下面列车的顺序,查看事件触发结果</h1>
<ul id="sortable">
  <li class="ui-widget-content">K22次 始发站:桂林 -> 终点站:北京西 </li>
  <li class="ui-widget-content">K180次 始发站:郑州 -> 终点站:北京西 </li>
  <li class="ui-widget-content">K1038次  郑州  -> 终点站:深圳</li>
  <li class="ui-widget-content">K236次  石家庄  -> 终点站:上海 </li>
  <li class="ui-widget-content">T182次 汉口  -> 终点站:哈尔滨</li>
  <li class="ui-widget-content">K926次  郑州  -> 终点站:哈尔滨</li>
</ul>
<div id="wrap"></div>
<div id="result"></div>
</body>
</html>

jQuery之排序组件的深入解析
Javascript 相关文章推荐
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
Sep 23 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
Mar 17 Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 Javascript
js实现当前输入框高亮显示的方法
Aug 19 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
Bootstrap模仿起筷首页效果
May 09 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
jquery轮播图插件使用方法详解
Jul 31 jQuery
如何实现小程序与小程序之间的跳转
Nov 04 Javascript
jQuery之日期选择器的深入解析
Jun 19 #Javascript
jQuery之按钮组件的深入解析
Jun 19 #Javascript
jQuery之自动完成组件的深入解析
Jun 19 #Javascript
jQuery之折叠面板的深入解析
Jun 19 #Javascript
jQuery之选择组件的深入解析
Jun 19 #Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 #Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 #Javascript
You might like
php抓即时股票信息
2006/10/09 PHP
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php email邮箱正则
2008/10/08 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
php自定义session示例分享
2014/04/22 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python 操作MySQL详解及实例
2017/04/30 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
python实现银行实战系统
2020/02/26 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
影视艺术学院毕业生自荐信
2013/11/13 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
长城的导游词
2015/01/30 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
Python竟然能剪辑视频
2021/05/25 Python
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
python小型的音频操作库mp3Play
2022/04/24 Python