PHP+jQuery实现随意拖动层并即时保存拖动位置


Posted in Javascript onApril 30, 2015

想拖动页面上的层,完全可以用jQuery ui的Draggable方法来实现,那如何将拖动后层的位置保存下来呢?本文将给出答案。本文讲解了如何采用PHP+MySQL+jQuery,实现随意拖动层并即时保存拖动位置。

PHP+jQuery实现随意拖动层并即时保存拖动位置

之前我有文章:,文中以项目为示例,讲解了实现拖动布局的方法。本文与之不同之处在于可以任意拖动页面位置,原理就是通过拖动将拖动后层的相对位置left,top和z-index三个参数更新到数据表中对应的记录,页面通过CSS解析每个层不同的位置。请看具体实现步骤。

准备MySQL数据表

首先需要准备一张表notes,用来记录层的内容,背景色和坐标等信息。

CREATE TABLE IF NOT EXISTS `notes` ( 
 `id` int(11) NOT NULL auto_increment, 
 `content` varchar(200) NOT NULL, 
 `color` enum('yellow','blue','green') NOT NULL default 'yellow', 
 `xyz` varchar(100) default NULL, 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后向表中插入几条记录,注意xyz字段表示的是层的xyz坐标的组合,格式为"x|y|z"。

drag.php

在drag.php中,需要读取notes表中的记录,显示在drag.php页面中,代码如下:

include_once('connect.php'); //链接数据库 
$notes = '';  
$left='';  
$top='';  
$zindex='';  
$query = mysql_query("select * from notes order by id desc"); 
while($row=mysql_fetch_array($query)){ 
  list($left,$top,$zindex) = explode('|',$row['xyz']); 
  $notes.= ' 
  <div class="note '.$row['color'].'" style="left:'.$left.'px;top:'.$top.'px;z-index:' 
.$zindex.'"> 
    <span class="data">'.$row['id'].'.</span>'.htmlspecialchars($row['content']).' 
  </div>'; 
}

然后将读取出来的$notes现在在div中。

<div class="demo"> 
  <?php echo $notes;?> 
</div>

注意,我在生成的每个DIV.note中定义了位置,即设置该div的left,top和z-index值。

CSS

.demo{position:relative; height:500px; margin:20px; border:1px dotted #d3d3d3} 
.note{width:150px; height:150px; position:absolute; margin-top:150px; padding:10px; 
 overflow:hidden; cursor:move; font-size:16px; line-height:22px;} 
.note span{margin:2px} 
 
.yellow{background-color:#FDFB8C;border:1px solid #DEDC65;} 
.blue{background-color:#A6E3FC;border:1px solid #75C5E7;} 
.green{background-color:#A5F88B;border:1px solid #98E775;}

有了样式之后,然后运行drag.php,这时就可以看到页面中排列的的几个层,但是还不能拖动,因为还要加入jQuery。

jQuery

首先需要载入jquery库和jquery-ui插件以及global.js。

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

然后再global.js加入代码:

$(function(){ 
  var tmp; 
   
  $('.note').each(function(){ 
    tmp = $(this).css('z-index'); 
    if(tmp>zIndex) zIndex = tmp; 
  }) 
  make_draggable($('.note')); 
}); 
var zIndex = 0;

global.js中,首先在$(function()里定义了一个变量tmp,通过判断每个div.note的z-index值,保证拖动时,该DIV在最上层(即z-index为最大值),就是不会被别的层覆盖。
并且设置zIndex的初始值为0。
接下来,写了一个函数make_draggable();该函数调用jquery ui插件的Draggable方法,处理拖动范围,透明度及拖动停止后执行的更新操作。

function make_draggable(elements){ 
  elements.draggable({ 
    opacity: 0.8, 
    containment:'parent', 
    start:function(e,ui){ ui.helper.css('z-index',++zIndex); }, 
    stop:function(e,ui){ 
      $.get('update_position.php',{ 
         x   : ui.position.left, 
         y   : ui.position.top, 
         z   : zIndex, 
         id  : parseInt(ui.helper.find('span.data').html()) 
      }); 
    } 
  }); 
}

当拖动时,将当前层的z-index属性设置为最大值,即保证当前层在最上面,不被其他层覆盖,并且设置了拖动范围和透明度,当停止拖动时,向后台update_position.php发送一个ajax请求,传递的参数有x,y,z和id的值。接下来我们来看update_position.php的处理。
update_position.php保存拖动位置
update_position.php需要做的是,获取前台通过ajax请求发来的数据,更新数据表中相应的字段内容。

include_once('connect.php'); 
if(!is_numeric($_GET['id']) || !is_numeric($_GET['x']) || !is_numeric($_GET['y']) || 
!is_numeric($_GET['z'])) 
die("0"); 
 
$id = intval($_GET['id']); 
$x = intval($_GET['x']); 
$y = intval($_GET['y']); 
$z = intval($_GET['z']); 
 
mysql_query("UPDATE notes SET xyz='".$x."|".$y."|".$z."' WHERE id=".$id); 
 
echo "1";

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
Script的加载方法小结
Jan 12 Javascript
js post提交调用方法
Feb 12 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
Javascript函数式编程语言
Oct 11 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
Javascript三种字符串连接方式及性能比较
May 28 Javascript
webpack的pitching loader详解
Sep 23 Javascript
js实现上下左右键盘控制div移动
Jan 16 Javascript
jquery实现键盘左右翻页特效
Apr 30 #Javascript
jquery Validation表单验证使用详解
Sep 12 #Javascript
jQuery实现企业网站横幅焦点图切换功能实例
Apr 30 #Javascript
JS实现动态移动层及拖动浮层关闭的方法
Apr 30 #Javascript
javascript实时获取鼠标坐标值并显示的方法
Apr 30 #Javascript
javascript实现鼠标拖动改变层大小的方法
Apr 30 #Javascript
jQuery实现伸展与合拢panel的方法
Apr 30 #Javascript
You might like
php下MYSQL limit的优化
2008/01/10 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
JS实现简单打字测试
2020/06/24 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python fileinput模块使用介绍
2014/11/30 Python
python实现一次创建多级目录的方法
2015/05/15 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
采购部岗位职责
2013/11/24 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
技术总监管理职责范本
2014/03/06 职场文书
个人总结与自我评价
2014/09/18 职场文书