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 相关文章推荐
关于JavaScript的with 语句的使用方法
May 09 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
JavaScript中 DOM操作方法小结
Apr 25 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
移动端触摸滑动插件swiper使用方法详解
Aug 11 Javascript
详解mpvue开发小程序小总结
Jul 25 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
javascript canvas检测小球碰撞
Apr 17 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 Javascript
Node与Python 双向通信的实现代码
Jul 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
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
玩转vue的slot内容分发
2018/09/22 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
Python之PyUnit单元测试实例
2014/10/11 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
python修改文件内容的3种方法详解
2019/11/15 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
基于python实现模拟数据结构模型
2020/06/12 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
selenium如何定位span元素的实现
2021/01/13 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
会计专业的自荐信
2013/12/12 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
综合测评自我评价
2015/03/06 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
用python开发一款操作MySQL的小工具
2021/05/12 Python
Python中使用ipython的详细教程
2021/06/22 Python
Java后台生成图片的完整步骤
2021/08/04 Java/Android
python接口测试返回数据为字典取值方式
2022/02/12 Python
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers
Python实现双向链表基本操作
2022/05/25 Python