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 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
jQuery使用技巧简单汇总
Apr 18 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
jquery easyui DataGrid简单示例
Jan 23 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
Mar 29 Javascript
Bootstrap 按钮样式与使用代码详解
Dec 09 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
javascript/jquery实现点击触发事件的方法分析
Nov 11 jQuery
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 图片上传代码
2011/09/13 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
js获取iframe中的window对象的实现方法
2016/05/20 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
AUC计算方法与Python实现代码
2020/02/28 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
法人授权委托书
2014/04/03 职场文书
安全演讲稿开场白
2014/08/25 职场文书
2015教师节通讯稿
2015/07/20 职场文书
2016十一国庆节感言
2015/12/09 职场文书
oracle覆盖导入dmp文件的2种方法
2021/05/21 Oracle
python pygame 开发五子棋双人对弈
2022/05/02 Python
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript