博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
客户端拖动控件封装(让拖动变得更简单)
阅读量:5970 次
发布时间:2019-06-19

本文共 3696 字,大约阅读时间需要 12 分钟。

在一些交互性强的前端页面中,经常用到物件拖动,因此封装了一下拖动控件的代码。

使用时只需绑定htc拖动控件,然后设定一些可拖动控件(其position需设为absolute)的canMove属性(为1表示可以拖动),layernum属性(拖动时,移动哪一个父元件)

None.gif
<!--
None.gifAuthor:        Kw.Tsou
None.gifDate:        2005/11/26
None.gifContent:    为页面上的元件提供自由移动的功能
None.gifUseMark:    在body(或其它容器)上behavior此物件,然后在需要移动的物件上设置canMove = "1" ,如果不是移动本身,则可以设置layernum指向其父元素.(注意:该移动的物件的position必须为absolute)
None.gif
-->
None.gif
<
PUBLIC:COMPONENT
>
None.gif    
<
PUBLIC:ATTACH 
EVENT
="onmousedown"
 ONEVENT
="move_eDown()"
 
/>
None.gif    
<
PUBLIC:ATTACH 
EVENT
="onmouseup"
 ONEVENT
="move_eUp()"
 
/>
None.gif    
<
PUBLIC:ATTACH 
EVENT
="onmousemove"
 ONEVENT
="move_eMove()"
 
/>
None.gif    
<
PUBLIC:EVENT 
ID
="moveevent"
  NAME
="ontagmove"
/>
None.gif
</
PUBLIC:COMPONENT
>
ExpandedBlockStart.gifContractedBlock.gif
<
SCRIPT 
Language
="JavaScript"
>
dot.gif
InBlock.gif    
var current = null;
InBlock.gif    
var offsetX = 0;
InBlock.gif    
var offsetY = 0;
InBlock.gif    
var dragging = false;
InBlock.gif    
var startedDragging = false;
InBlock.gif    
var ismove = false;
InBlock.gif    
InBlock.gif    
function setCurrent(w)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        current 
= w;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(current.style.position!="absolute")dot.gif{
InBlock.gif            alert(
"可移动物件的position必须为absolute,才可更好地移动");
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
var ex = event.clientX;
InBlock.gif        
var ey = event.clientY;
InBlock.gif        offsetX 
= event.x - current.offsetLeft;
InBlock.gif        offsetY 
= event.y - current.offsetTop;
InBlock.gif        dragging 
= true;
InBlock.gif        ismove 
= false;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
function moveCurrent()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (!dragging || !current)
InBlock.gif            
return;
InBlock.gif            
InBlock.gif        
if (event.button == 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            releaseCurrent();
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif          
InBlock.gif        
if (!startedDragging)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            startedDragging 
= true;
ExpandedSubBlockEnd.gif        }
InBlock.gif          
InBlock.gif        
var ex = event.clientX;
InBlock.gif        
var ey = event.clientY;
InBlock.gif        
var newl = ex - offsetX;
InBlock.gif        
var newt = ey - offsetY
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(newl!=current.style.pixelLeft||newt!=current.style.pixelTop)dot.gif{
InBlock.gif            current.style.pixelLeft 
= ex - offsetX;
InBlock.gif            current.style.pixelTop 
= ey - offsetY;
InBlock.gif            ismove 
= true;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
InBlock.gif        window.event.returnValue 
= false;
InBlock.gif        window.event.cancelBubble 
= true;
InBlock.gif        
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
function releaseCurrent()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        current
=null;
InBlock.gif        dragging 
= false;
InBlock.gif        startedDragging 
= false;
InBlock.gif        window.event.returnValue 
= false;
InBlock.gif        window.event.cancelBubble 
= true;
ExpandedSubBlockEnd.gif    }
  
InBlock.gif
InBlock.gif    
//取得移动对象(如只能拖动标题栏进行移动)
ExpandedSubBlockStart.gifContractedSubBlock.gif
    function getOpreateElement(el)dot.gif{
InBlock.gif        
//debug();
InBlock.gif
        var ret = el;
InBlock.gif        
var layernum = 0;
InBlock.gif        
if(el.layernum)
InBlock.gif            layernum 
= parseInt(el.layernum);
InBlock.gif        
for(var i=0;i<layernum;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            ret 
= ret.parentElement;
ExpandedSubBlockEnd.gif        }
InBlock.gif        
return ret;
InBlock.gif
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
function move_eDown()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
var e = window.event;
InBlock.gif        
var el = e.srcElement;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(el.canMove=="1")dot.gif{
InBlock.gif            el 
= getOpreateElement(el);
ExpandedSubBlockStart.gifContractedSubBlock.gif            
if(!el.isLock)dot.gif{
InBlock.gif                
if(!(el.isResize=="1"&&el.runtimeStyle.cursor.indexOf("resize")>0))
InBlock.gif                    setCurrent(el);
ExpandedSubBlockEnd.gif            }
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
function move_eUp()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
var tmp =null;
InBlock.gif        
if(current!=null)
InBlock.gif            tmp 
= current;
InBlock.gif        releaseCurrent();
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(tmp!=null&&ismove)dot.gif{
InBlock.gif            
InBlock.gif            
var evt = createEventObject();
InBlock.gif            evt.src 
= tmp;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
try dot.gif{ moveevent.fire(evt); } catch(e) dot.gif{};
ExpandedSubBlockEnd.gif        }
InBlock.gif        ismove 
= false;
InBlock.gif        tmp 
= null;
InBlock.gif        
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
function move_eMove()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        moveCurrent();
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif
None.gif
</
SCRIPT
>
None.gif
None.gif
None.gif
<
html
>
None.gif
<
head
>
None.gif
<
title
>
什么都可以拖动
</
title
>
ExpandedBlockStart.gifContractedBlock.gif
<
style
>
dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gifbody,div,td,font
{
dot.gif}
{
font:menu;}
ExpandedSubBlockStart.gifContractedSubBlock.gifdiv,td
{
dot.gif}
{
text-align:center}
None.gif
</
style
>
None.gif
</
head
>
None.gif
<
body 
style
="margin:0px"
>
None.gif
<
div 
ontagmove
="window.status=' left:' + window.event.src.offsetLeft + ' top:' + window.event.src.offsetTop"
 style
="margin:3px;position:absolute;overflow:hidden;behavior:url(BlogMoveAble.htc);border:1px solid gray;width:90%;height:90%;background-color:#efefef"
>
None.gif    
<
div 
canMove 
= "1"
 style
="background-color:gray;border:1px solid red;cursor:move;top:20px;left:20px;position:absolute;width:100px;height:100px;"
>
None.gif        这是一个div
None.gif    
</
div
>
None.gif    
<
div  
style
="background-color:#e1e1e1;border:1px solid blue;;top:120px;left:120px;position:absolute;width:180px;height:120px;"
>
None.gif        
<
div 
style
="height:30px;border:1px solid white;background-color:white;color:black;cursor:move"
 canMove
="1"
 layernum
="1"
>
只有标题可以拖动
</
div
>
None.gif        这是一个div
None.gif    
</
div
>
None.gif    
<
table 
border
="1"
 bordercolor
="green"
 style
="width:50%;height:50%;position:absolute"
>
None.gif        
<
tr
>
None.gif            
<
td 
canMove
="1"
 layernum
="3"
 colspan
="2"
 style
="cursor:move;background-color:blue;color:white"
>
这是表格的标题行
</
td
>
None.gif        
</
tr
>
None.gif        
<
tr
>
None.gif            
<
td
>
1
</
td
>
None.gif            
<
td
>
2
</
td
>
None.gif        
</
tr
>
None.gif        
<
tr
>
None.gif            
<
td
>
3
</
td
>
None.gif            
<
td
>
4
</
td
>
None.gif        
</
tr
>
None.gif    
</
table
>
None.gif
</
div
>
None.gif
</
body
>
None.gif
</
html
>
None.gif

预览:

下载:

你可能感兴趣的文章
NPM酷库:semver 语义化版本判断
查看>>
微信支付 (当前页面URL未注册) 解决方案(angularjs)
查看>>
【332天】跃迁之路——程序员高效学习方法论探索系列(实验阶段90-2018.01.03)...
查看>>
【337天】每日项目总结系列075(2018.01.08)
查看>>
fsLayuiPlugin多数据表格使用
查看>>
最小二乘法小结
查看>>
分享 | 撞坏遥控车后,有个技术大牛爸爸是种怎样的体验
查看>>
Angular4最佳事件一些规范问题
查看>>
发红包
查看>>
Java容器类研究3:AbstractCollection
查看>>
【源码解析】redux-thunk
查看>>
Just for fun——windows上的php-fpm
查看>>
javascript与三角函数之四:碰撞检测
查看>>
浅谈js中的闭包
查看>>
简单vue项目脚手架
查看>>
重拾css(1)——写在前边的话
查看>>
Vue.js实现用户登录退出和e2e测试
查看>>
React系列---React-Router
查看>>
使用rollup构建你的JavaScript项目【一】
查看>>
Python: 作用域(scope) 和 LEGB
查看>>