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 相关文章推荐
jquery插件制作 表单验证实现代码
Aug 17 Javascript
extjs3 combobox取value和text案例详解
Feb 06 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
JS中传递参数的几种不同方法比较
Jan 20 Javascript
jQuery为DOM动态追加事件的方法
Feb 16 Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 Javascript
js实现石头剪刀布游戏
Oct 11 Javascript
JavaScript用document.write()输出换行的示例代码
Nov 26 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
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php封装的smarty类完整实例
2016/10/19 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
浅谈vuepress 踩坑记
2018/04/18 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python中的异常处理学习笔记
2015/01/28 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
建筑文秘专业个人求职信范文
2013/12/28 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
学校文明单位申报材料
2014/05/06 职场文书
垃圾桶标语
2014/06/24 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
中学生打架检讨书
2014/10/13 职场文书
写给媳妇的检讨书
2015/05/06 职场文书