jQuery拖动布局其结果保存到数据库


Posted in Javascript onOctober 09, 2015

最近的项目中涉及到了用户个性化定制首页的需求,用户要求可以随意拖动首页模块的位置,来实现个性化的布局。本文讲解如何使用和PHP实现拖动布局并将拖动后的布局位置保存到数据库。

jQuery拖动布局其结果保存到数据库

很多网站的拖动布局的例子都是采用浏览器的COOKIE来记录用户拖动模块的位置,也就是说拖动后各模块的排序位置信息是记录在客户端的cookie里的。当用户清空客户端的cookie或浏览器的cookie过期后,再次访问页面时,发现布局又还原成最初的状态。这种cookie记录的方式使用简单,但不适合像个人中心、管理系统主页的要求。
本例实现的效果:
通过拖动随意布局页面模块。
记录拖动后模块的位置,并记录到数据库中。
页面永久性布局,用任意浏览器在任意时候打开,页面布局不变。(除非用户再次更改模块的排序,跟cookie没有关系)。
原理
采用的拖动排序插件实现拖动效果。
将拖动后的模块的位置通过ajax传给服务端PHP程序。
PHP程序处理位置信息后,更新数据库中相应的字段内容。
XHTML

<div id="loader"></div> 
<div id="module_list"> 
  <input type="hidden" id="orderlist" /> 
  <div class="modules" title="1"> 
   <h3 class="m_title">Module:1</h3> 
   <p>1</p> 
  </div> 
  ... 
</div>

DIV#loader用于显示提示信息,如loading...,#orderlist是一个隐藏域,用于记录模块的排序值。“...”表示循环了n个DIV.modules,具体生成的代码在后面会讲到。
CSS

#module_list{margin-left:4px} 
.modules{float:left; width:200px; height:140px; margin:10px; border:1px solid #acc6e9; 
 background:#e8f5fe} 
.m_title{height:24px; line-height:24px; background:#afc6e9} 
#loader{height:24px; text-align:center}

简单,关键是要给.modules一个想左浮动的样式float:left。
jQuery

$(function(){ 
  $(".m_title").bind('mouseover',function(){ 
    $(this).css("cursor","move") 
  }); 
   
  var $show = $("#loader"); 
  var $orderlist = $("#orderlist"); 
  var $list = $("#module_list"); 
   
  $list.sortable({ 
    opacity: 0.6, //设置拖动时候的透明度 
    revert: true, //缓冲效果 
    cursor: 'move', //拖动的时候鼠标样式 
    handle: '.m_title', //可以拖动的部位,模块的标题部分 
    update: function(){ 
       var new_order = []; 
       $list.children(".modules").each(function() { 
        new_order.push(this.title); 
       }); 
       var newid = new_order.join(','); 
       var oldid = $orderlist.val(); 
       $.ajax({ 
        type: "post", 
        url: "update.php", //服务端处理程序 
        data: { id: newid, order: oldid },  //id:新的排列对应的ID,order:原排列顺序 
        beforeSend: function() { 
           $show.html("<img src='load.gif' /> 正在更新"); 
        }, 
        success: function(msg) { 
           //alert(msg); 
           $show.html(""); 
        } 
       }); 
    } 
  }); 
});

拖动排序的动作都写在$list.sortable({...})里面,参数设置和方法请看代码的注释。juery ui的sortable插件提供了很多方法和参数配置,详情请查看
拖动完成要执行一个update方法,该方法需要将拖动后排序的位置通过ajax提交给后台处理。

var new_order = []; 
$list.children(".modules").each(function() { 
   new_order.push(this.title); 
}); 
var newid = new_order.join(','); 
var oldid = $orderlist.val();

说明:循环每个模块.modules,获取拖动排序后每个模块的属性title值,将值通过逗号连接成一个字符串。原来的未拖动之前的排序值从隐藏域orderlist中获取。
获取排序值后,就是通过ajax和后台程序交互了。
PHP
update.php接收前端ajax通过POST提交过来的两个参数,及排序前的值和排序后的值,将这连个值进行对比,如果不相等,则更新数据库中的排序字段,完成了拖动排序后的及时保存。

include_once("connect.php");//连接数据库 
$order = $_POST['order']; 
$itemid = trim($_POST['id']); 
if (!emptyempty ($itemid)) { 
  if ($order != $itemid) { 
    $query = mysql_query("update sortlist set sort='$itemid' where id=1"); 
    if ($query) { 
      echo $itemid; 
    } else { 
      echo "none"; 
    } 
  } 
}

首页index.php
再回到展示布局的首页index.php。index.php通过连接数据库读取模块的排序信息,并将各模块显示出来。
首先别忘了加载jquery库和jquery ui的sortable拖动排序插件。

<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery-ui.min.js"></script>

读取数据库的排序字段值。

include_once("connect.php"); 
 
$query=mysql_query("select * from sortlist where id=1"); 
if($rs=mysql_fetch_array($query)){ 
  $sort=$rs['sort']; 
} 
$sort_arr=explode(",",$sort); 
$len=count($sort_arr);

循环显示各模块。

<div id="loader"></div> 
<div id="module_list"> 
 <input type="hidden" id="orderlist" value="<?php echo $sort;?>" /> 
 <?php 
   for($i=0;$i<$len;$i++){ 
 ?> 
 <div class="modules" title="<?php echo $sort_arr[$i]; ?>"> 
   <h3 class="m_title">Module:<?php echo $sort_arr[$i]; ?></h3> 
   <p><?php echo $sort_arr[$i]; ?></p> 
 </div> 
 <?php } ?> 
</div>

诚然,真正的拖动排序结果的保存都跟每个用户信息相关联,所以数据库的结构设计方面大家可以自行解决,尽情发挥吧。

以上就是jQuery实现拖动布局并将排序结果保存到数据库的实现过程,希望对大家的学习有所帮助。

Javascript 相关文章推荐
动感效果的TAB选项卡jquery 插件
Jul 09 Javascript
js跑马灯代码(自写)
Apr 17 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
Aug 31 Javascript
jquery遍历json对象集合详解
May 18 Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 Javascript
AngularJS 作用域详解及示例代码
Aug 17 Javascript
JS如何生成一个不重复的ID的函数
Dec 25 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
Dec 03 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 Javascript
node koa2 ssr项目搭建的方法步骤
Dec 11 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 #Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 #Javascript
JS实现样式清新的横排下拉菜单效果
Oct 09 #Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 #Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
Oct 08 #Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
Oct 08 #Javascript
js小数运算出现多位小数如何解决
Oct 08 #Javascript
You might like
Terran热键控制
2020/03/14 星际争霸
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php cli换行示例
2014/04/22 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
python调用API实现智能回复机器人
2018/04/10 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
如何编写python的daemon程序
2021/01/07 Python
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
英语专业个人求职信范文
2014/02/01 职场文书
学校标语大全
2014/06/19 职场文书
纪律教育月活动总结
2014/08/26 职场文书
创先争优演讲稿
2014/09/15 职场文书
法人委托书范本
2014/09/15 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
2014年教师工作总结
2014/11/10 职场文书
2015年信访工作总结
2015/04/07 职场文书
2016国培研修心得体会
2016/01/08 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏