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

一、开篇

似乎拖拽已经被写烂了,没得写的了,可是我这次又来了~

上一次写的是跨列拖放,这次我要带给大家的是跨页拖放。

可以到这里来看看效果:示例效果

说明:1、如果将方框拖动到页签上立刻释放掉的话,则会被添加到该页的第一列的第一个位置;

     2、如果将方框拖动到页签上并且停留片刻的话,则页面就会转换到该页,这个时候可以在页签上释放,也可以将方框拖动到此页的具体位置释放。

二、原理

     我是在跨列拖放的基础上修改的代码,虽然仅仅是从跨“列”升级为跨“页“,但是这就意味着多了一个dimension。所以代码改动比较大,尤其是初始化的代码。

为了弄清楚代码中的命名同时也便于阐述原理,我画了下面的图


 

 

1、在拖动开始时,跟之前的跨列拖拽差不多,基本上不需要修改;

2、在拖动的过程中,就需要判断拖动module时的鼠标是否是在某个tab上,如果在tab上,则把dragGhost(拖动中占位的虚线框)隐藏了,并且设置转换页面的timeout(注意:这个timeout不要设置重复了,而且如果鼠标就在本页上就不需要设置),在设置这个timeout的响应函数也要小心,必须先把拖动的module放到新的页面然后再转换页面,因为鼠标虽然拖动了module,但是在html代码中,这个module还是属于原来的页面(只是因为positionabsolute才让它游离出来的),如果原来的页面因为页面转换而变得不可见了,那么鼠标拖动的module也会不翼而飞的。

3、在拖动的过程中,如果鼠标不在某个tab上,首先要将timeout及时清除了,要不然在拖动时会莫名其妙的转换页面,剩下的跟页面内拖放是一样的计算方法来处理,也是先计算所在的列,然后计算再这个列的位置,在此不再累述。

4、在拖动的过程中,注意维持modulecolumn变量,这个变量对于拖放很重要,要及时而正确的更新。

5、在拖动结束的时候,如果鼠标还在某个tab上(无论这个时候页面是不是因为鼠标的停留而改变),则把module放在这一页的第一列的第一个位置。如果不在tab上,那么和页面内拖放是一样的。无论怎样,在最后都要设置一些style以及更新个别变量,放置完毕。

三、代码

       原理说起来容易,写起来还是很麻烦的,而且得经过很多次测试才能成功的。

       不过我总结出来几点:

       1、对于任何一个对象,要分清楚这个对象是html对象还是我们自定义类的对象;

       2、各种对象尽量少维持一些变量,要不然在每次动作发生的时候都会去更新一堆变量,那将是很麻烦的(或许可以将这些变量的设置封装成对象的方法);

       主要代码如下:

Code

四、示例下载

      点此下载示例

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

  回复  引用  查看    
#1楼 2008-09-23 16:15 | cloudgamer      
厉害
  回复  引用  查看    
#2楼 2008-09-23 16:27 | ITAres      
很不错
  回复  引用  查看    
#3楼 2008-09-23 16:29 | chy710      
现在流行拖

  回复  引用    
#4楼 2008-09-23 17:15 | 路人A [未注册用户]
拖拽都存在一个问题,拖出窗口范围就会跟着鼠标跑.
让人用着很不爽.

  回复  引用  查看    
#5楼 2008-09-23 17:21 | 抛物线      
不错,很好,学习
webpart就是这玩意
  回复  引用  查看    
#6楼 2008-09-23 18:29 | chegan      
拖拽都能被楼主写成一个系列阿,很好
  回复  引用  查看    
#7楼 2008-09-23 19:05 | Justin      
楼主继续发扬一下,把拖拽后的结果持久化起来
  回复  引用  查看    
#8楼 2008-09-23 21:32 | 侯垒      
很拽.
  回复  引用  查看    
#9楼 2008-09-23 21:54 | Felix      
不错不错
  回复  引用  查看    
#10楼 2008-09-24 09:16 | Jillean Wong      
真的很不错,效果和jQuery的一个例子很像,是你自己写的代码吗?
  回复  引用  查看    
#11楼 [楼主]2008-09-24 10:28 | LongWay      
@Jillean Wong
是自己写的,除了所引用的那个Drag.js
  回复  引用  查看    
#12楼 2008-09-25 09:03 | 阿富      
如何能看 div在 object上面拖,比如object很大,而div很小,div永远在object下面 。而如果用iframe 的话,怎么处理事件?在本页里处理还是,iframe里?



<div>
<iframe>
//只是iframe的内容
<div>header</div>
<div>内容</div>
</iframe>
</div>

<object></object>




  回复  引用    
#13楼 2008-10-13 08:59 | 潘凯 [未注册用户]
为什么在ie6上,被拖动对象的高度比原来小,好像margin没有起到作用!
另外当鼠标被单击的时候,在ie6上被拖拽对象显示的位置是在原位置的上方,而不像在ff上是显示在下面的

  回复  引用    
#14楼 2008-10-13 09:41 | 潘凯 [未注册用户]
对了,楼主
item对象的columnsX好像一直没有更改,如果一个item从第一页拖动到了第二页,它的columnsX还是相对于第一页的值,是吗?
  回复  引用  查看    
#15楼 [楼主]2008-10-14 03:07 | LongWay      
@潘凯
看得真够仔细的
的确在切换页面过后没有更新columnsX
如果要方便的修改的话,就把
this.columnsX = [];
for(var i=0;i<self.column.page.columns.length;i++){
this.columnsX.push(findPosX(self.column.page.columns[i]));
}
这几句放到onDrag的刚开始的地方就行了
  回复  引用    
#16楼 2008-10-14 09:51 | 潘凯 [未注册用户]
columns倒没什么,主要是在ie下面,当对象被拖动时,被拖动对象的高度和原来的不一样,是不是浏览器对css的解释不一样啊?在ff下面,元素被拖拽和为被拖拽时,高度都是一样的。
谢谢楼主回复,很喜欢javascript,觉得做网站javascript和css很重要,其他的业务逻辑都是些对数据库表的增加、删除、修改,很没意思!
  回复  引用  查看    
#17楼 [楼主]2008-10-14 11:17 | LongWay      
@潘凯
我试了一下,如果position为absolute的时候,里面的p标签的margin-bottom就没有了,应该就是浏览器的一些细微的差别吧,具体是怎么的我现在也还不知道
还有你说的在ie和ff下,鼠标点击标题的时候,被拖拽的对象显示的位置不一样,一个向左上角偏移一个向右下角偏移,这个应该是findPosX和findPosY这两个辅助函数引起的,在ie下没能获取足够精确的坐标,同样的,这还导致了在ie下页间拖拽的时候判断鼠标所悬停的页签的不准确,这几个地方都还需要改进一下

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



相关文章:


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

相关链接: