简易而又灵活的Javascript拖拽框架(三)

一、开篇

     这是这个拖拽系列的第三篇了,第一篇简单的介绍了一下这个拖拽框架,第二篇用这个框架做了一个Tab标签的拖放。这次用这个拖拽框架做一个更复杂一点的效果——跨列拖放。就像iGoogle和netvibes的个性页面布局那样。

 

二、原理

 框架在第一篇做了介绍,这里直接使用。

首先要找到每个可以拖动的item,对于每个拖动的item,对其注册组件Drag.init(handle,dragBody);并且要把这个对象所在的列赋值给这个对象

还是分三个步骤说这个拖放的过程

1、鼠标拖动开始的时候,除了要将dragGhost放到当前被拖动的对象原来的位置上,还要记录每一列的左边距,当然还是要设置被拖动对象的position

 

2、鼠标拖动的过程中

先找到拖动对象是在哪一列,通过现在拖动对象的位置和在拖动开始时记录的列的左边距相比较,得出当前拖动对象在哪一列。


 

如果在原来那一列上,则不用管了,如果在别的列上,则将dragGhost插入到这个新的列中去(用column.appendChild插入到最后)。无论是本来就在这一列的元素还是从别的列拖过来的元素,都得让拖动对象与他所在的列的每一个元素的纵坐标相比较,得出应该在这一列的什么位置,将dragGhost插入(用column.insertBefore)。至于怎么找到拖动元素应该放在这一列的什么位置,这个原理和上边找列的原理差不多,只是比较的是纵坐标的值,比较的对象是本列的所有对象(注意,遍历的时候一定要排除dragGhost和本身,要不然在本列不能向下拖动)。

3、拖动完成

ghost替换为被拖动的元素,设置相应的样式

三、代码

Code

 如果这样不方便观看,可以下载示例。

四、示例下载

      点此下载示例

posted @ 2008-09-16 15:17 LongWay 阅读(2749) 评论(25)  编辑 收藏 网摘 所属分类: Javascript

  回复  引用  查看    
#1楼 2008-09-16 15:21 | 小眼睛老鼠      
好东西
收藏了
  回复  引用  查看    
#2楼 2008-09-16 15:27 | 丁学      
博主还真是速度,呵呵,收藏
  回复  引用    
#3楼 2008-09-16 15:32 | At [未注册用户]
不错,挺有趣的,也很有实际应用价值。
具体到网站应用,如果是游客,可以把拖拽后的框架所在的列和样式以cookie的形式记录下来,用户刷新页面先读cookie以保持上次拖拽后的样式;如果是登陆后的会员访问,可以在某个表里添加一个字段保存位置信息,需要的时候进行分析、提取、应用。
  回复  引用    
#4楼 2008-09-16 15:33 | At [未注册用户]
没具体做过.. 只是随口说说,不知道实际运用是不是应该这样
  回复  引用  查看    
#5楼 2008-09-16 15:36 | 老Q      
请问,能不能横排
如果能横排,可以做一些自定义DataGrid列的操作。
  回复  引用  查看    
#6楼 [楼主]2008-09-16 15:44 | LongWay      
@老Q
横排?你的意思是说拖动列?也是可以的,不过代码就不是这样的了~
  回复  引用  查看    
#7楼 2008-09-16 16:00 | 余敏      
不知道实际布局数据存在哪?
  回复  引用  查看    
#8楼 2008-09-16 17:01 | 烟仔      
怎么能保存数据,让用户下次打时还是上次排的布局
  回复  引用  查看    
#9楼 [楼主]2008-09-16 18:37 | LongWay      
@烟仔
在保存数据的时候可以用js遍历每一列可拖动的item,遍历总是从上到下的、从前到后的!然后用ajax向服务器传数据,没问题的,我做过能保存数据的页面!
  回复  引用  查看    
#10楼 2008-09-16 22:11 | 古道      
用.net的webparts开发的和这个有什么区别?
好处在哪?
  回复  引用  查看    
#11楼 2008-09-16 22:15 | 曲滨*銘龘鶽      
代码不错挺使用的;

不过楼主有标题党嫌疑乱用“框架”;
你这东西最多是算 通用代码段,脚本库

jquery 也只不过是 “JQuery JavaScript Library“
也没说自己是 Framework;


园子里现在(不是园子很多人都这样),“框架”一词越来越乱用了,是不是因为这个名字很大气,很好听?

那位大神,赶紧给大家统一下思想;不是我‘咬文嚼字’
要不现在风气太不好了,就和国内现在拍电影一样,本来不是什么大片却说是大片,这样会带坏年轻人典型的浮夸现象;

  回复  引用  查看    
#12楼 [楼主]2008-09-16 23:11 | LongWay      
@曲滨*銘龘鶽
多谢指出!我想我会在标题中把那两个字删了吧!
呵呵,当时写文章就是不好形容这个,所以就用了“框架”二字,我也没想要怎么浮夸的哈!
  回复  引用  查看    
#13楼 [楼主]2008-09-16 23:13 | LongWay      
@古道
在webpart中好像不能在除了ie的其他浏览器拖放吧?
  回复  引用  查看    
#14楼 2008-09-16 23:46 | chegan      
@古道
在webpart中好像不能在除了ie的其他浏览器拖放吧?

是不能拖放,呵呵,当初觉得好奇怪的,怎么微软的东西会不兼容其它类型的浏览器呢?并且实现起来也不会很难
  回复  引用  查看    
#15楼 2008-09-17 11:31 | peace      
无条件顶一下
  回复  引用  查看    
#16楼 2008-09-17 14:44 | 簡簡單單..      
Mark
  回复  引用  查看    
#17楼 2008-09-18 08:49 | liyundong      
不错,蛮好的。
  回复  引用    
#18楼 2008-09-19 11:49 | 生活在线 [未注册用户]
--引用--------------------------------------------------
At: 不错,挺有趣的,也很有实际应用价值。
具体到网站应用,如果是游客,可以把拖拽后的框架所在的列和样式以cookie的形式记录下来,用户刷新页面先读cookie以保持上次拖拽后的样式;如果是登陆后的会员访问,可以在某个表里添加一个字段保存位置信息,需要的时候进行分析、提取、应用。
--------------------------------------------------------

我想这样做,但还没研究出来改怎么写代码
  回复  引用  查看    
#19楼 2008-09-29 17:54 | Jonllen Peng      
兄弟,我用了你的拖拽JS代码,感觉挺好用的,准备应用到实际中来(个性主页),所以先谢谢了,但是我把这些代码放在ASPX里面在FF里面有一点BUG,就是你在拖拽的时候那个dragGhost的div层的宽度变成了100%,撑开了整个页面所有对你拖拽放在那里就会导致一些不完美,后来我找了很久原因,因为是。NET自动生成页面里面多了一个<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">就会导致在FF里面拖拽的时候有问题(IE里面没问题,在你最初试的html静态页面里面也不会存在这样的问题),我这方面不是很了解,所以有劳请LZ帮我解决一下这个问题,以后还有一些问题想要请教LZ,希望能和你交个朋友,期待你的回答。
  回复  引用  查看    
#20楼 [楼主]2008-09-29 19:12 | LongWay      
@Jonllen Peng
多谢这位朋友的提醒啊!我在写html的没有doctype标签是我的失误!
xhtml1-tranditional的dtd对js的有一定的规定,其中有一种规定就是:用js给html元素的坐标(包括高度宽度)赋值时,必须是以长度单位结束的字符串,比如:
this.style.height = "50px"(后面的px是必不可少的)

在这个示例代码中,onStartDarg的函数中,在赋值时都没有加坐标:
dragGhost.style.height = isIE?this.offsetHeight:this.offsetHeight - 2;
this.style.width = this.offsetWidth;
this.style.left = findPosX(this) - 5;
this.style.top = findPosY(this) - 5;
这几句后面都应该加上"px"的单位:
dragGhost.style.height = (isIE?this.offsetHeight:this.offsetHeight - 2) + "px";
this.style.width = this.offsetWidth + "px";
this.style.left = (findPosX(this) - 5) + "px";
this.style.top = (findPosY(this) - 5) + "px";

现在我把示例代码更新了,再次感谢这位朋友找到错误!
  回复  引用  查看    
#21楼 2008-09-30 10:03 | Jonllen Peng      
LZ实在是html高手js牛人了,我一说有这个问题你就马上能解决,真是太羡慕你的技术,我上次找了很久,也去调试去看它的宽度是多少?我明知道确实是有这个宽度却没有找到这个问题,实在是惭愧。。。以前有碰到过页面DOCTYPE 声明的问题,那时候好象是在页面里面指定的cursor是一个ani图片的不能完全显示出来,就是因为这个声明规范的问题。
LZ的拖拽一、二、三、四篇都看完了,不过我觉得最好的应该属这篇了,我觉得现在这个拖拽现在真的很流行,象IGOOGLE、TOM的主页(tom做的很差,拖拽有很多BUG,还没LZ写得好用,呵呵)都是采用这个方式,而LZ的拖拽四里面用到的'跨页提交'我觉得实际用处不大,像三这样就已经很好了的。我觉得唯一美中不足的话就是没有用COOKIE保存起状态来,园子里面有很多朋友也这么认为的。所以我觉得:LZ要是有时间的话,看能不能在三的基础上用Cookie来保存一下每个拖拽的item,你可以为他们分别设置一个ID或是什么标识别的,毕竟这些都是LZ的自己写的,所以还是由LZ来完善一下的好,这样我觉得应该就完美了。
  回复  引用  查看    
#22楼 [楼主]2008-09-30 12:47 | LongWay      
@Jonllen Peng
说是“高手“”牛人”我都不敢当哈,js对cookie的操作还不怎么熟悉,如果有时间的话我会去研究研究的哈,呵呵
  回复  引用    
#23楼 2008-10-20 19:41 | y2ksatan [未注册用户]
sos LZ,我把您这篇CSS改
<style type="text/css">
#container{width:100%;}
.column{width:100%;border:solid 1px #CCCCCC;background:#FCFCFC;padding:0px;margin:10px;}
.item{float:left;text-align:center;padding:0px;margin:10px;border:solid 1px #CCCCCC;background:white;width:auto;}
.item h3{margin:0px;height:20px;border-bottom:solid 1px #CCCCCC;background:#CCCCCC;color:white;cursor:move;}
</style>
也就是 把column改为row后。拖动时候放置定位不准确了。求解决方法T_T..
  回复  引用  查看    
#24楼 [楼主]2008-10-21 11:14 | LongWay      
@y2ksatan
你所设置的css有3个地方需要修改:
1、.column的宽度不应该100%,必须为定宽
2、.column必须要float,这才能让这三列从左到有排列
3、.item不能有float,这会让.item的div紧缩,导致不能填满容器
  回复  引用  查看    
#25楼 2008-11-09 13:29 | 灵魂独行      
好东西收藏
学习中

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-10-08 14:20 编辑过
Google站内搜索



相关文章:


相关搜索:
Javascript 拖拽 框架 跨列 拖放 netvibes iGoogle

相关链接: