var dragobj={}
window.onerror=function(){return false}
function on_ini()// 初始化
{
String.prototype.inc=function(s){return this.indexOf(s)>-1?true:false};// prototype是系统内置,此处是自行扩展判断一字符串内是否包含另一字符串
var agent=navigator.userAgent;// 获取从客户端向服务器发送的HTTP协议用户代理头的值。
window.isOpr=agent.inc("Opera");// 判断代理头值是否包含字符Opera
window.isIE=agent.inc("IE")&&!isOpr;// 判断代理头值是否包含字符IE
window.isMoz=agent.inc("Mozilla")&&!isOpr&&!isIE;// 判断代理头值是否包含字符Mozilla
if(isMoz)// 如果是Mozilla的FireFox浏览器
{
Event.prototype.__defineGetter__("x",function(){return this.clientX+2});// 扩展event的属性:鼠标x坐标
Event.prototype.__defineGetter__("y",function(){return this.clientY+2});// 扩展event的属性:鼠标y坐标
}
basic_ini();
}
function basic_ini()// 基本初始化
{
window.$=function(obj){return typeof(obj)=="string"?document.getElementById(obj):obj};// 为当前网页添加方法:根据对象ID获取对象
window.oDel=function(obj){if($(obj)!=null){$(obj).parentNode.removeChild($(obj))}};// 为当前网页添加方法:删除对象
}
window.onload=function()// 页面加载时
{
on_ini();// 初始化
var o=document.getElementsByClassName("elgg-list-item");// 获取所有的Div标题元素
for(var i=0;i<o.length;i++)
{
o[i].onmousedown=function(e)// 鼠标按下时
{
if(dragobj.o!=null)// 如果被拖拽对象不为空(即前一对拖拽对象未释放)
return false;
e=e||event;// 在某些浏览器中为e?
dragobj.o=this;// o为一个Div标题,所以取其父节点即是DIV为被拖拽对象
dragobj.xy=getxy(dragobj.o);// 获取选中DIV边框外界相对客户区左边的坐标:上,左,宽,高
dragobj.xx=new Array((e.x-dragobj.xy[1]),(e.y-dragobj.xy[0]));// 鼠标以Div边框外界左上角为原点的坐标.
dragobj.o.style.width=dragobj.xy[2]+"px";// 设置div的宽(含边框)
dragobj.o.style.height=dragobj.xy[3]+"px";// 设置div的高(含边框)
dragobj.o.style.left=(e.x-dragobj.xx[0]+5)+"px";// 设置div的左边距(边框外界至客户区左边内部的距离+5)
dragobj.o.style.top=(e.y-dragobj.xx[1]+5)+"px";// 设置div的上边距(边框外界至客户区左边内部的距离+5)
dragobj.o.style.position="absolute";// 设置坐标为绝对位置
dragobj.o.style.backgroundColor='#3980F4';// 设置浮动层的颜色
dragobj.o.style.opacity="0.5"; // 设置浮动层透明度
var om=document.createElement("div");// 创建一个DIV
dragobj.otemp=om;// 创建一个临时对象,内部不包含任何东西
om.style.width=dragobj.xy[2]+"px";// 设置临时对象宽度跟被拖拽对象相同
om.style.height=dragobj.xy[3]+"px";// 设置临时对象高度跟被拖拽对象相同
dragobj.o.parentNode.insertBefore(om,dragobj.o);// 将临时对象插入到被拖拽对象之前.占据被拖拽对象原位置,而在鼠标移动过程中根据鼠标位置,其将被移到相应位置,在相应位置撑出一个空位.
return false
}
}
}
document.onselectstart=function(){return false}// 禁用选择文本
window.onfocus=function(){document.onmouseup()}// 页面获得焦点
window.onblur=function(){document.onmouseup()}// 页面失去焦点
document.onmouseup=function()// 鼠标松开时
{
if(dragobj.o!=null)// 如果被拖拽对象不为空
{
dragobj.o.style.width="auto";
dragobj.o.style.height="auto";
dragobj.o.style.backgroundColor=""; // 设置透明层的颜色
dragobj.o.style.opacity="1.0"; // 设置透明层透明度
dragobj.otemp.parentNode.insertBefore(dragobj.o,dragobj.otemp);// 移动dragobj.o在dragobj.otemp之前插入
dragobj.o.style.position="";
oDel(dragobj.otemp);// 删除临时对象dragobj.otemp
dragobj={};// 清空拖拽对象
}
}
document.onmousemove=function(e)// 鼠标移动时
{
e=e||event
if(dragobj.o!=null)// 如果被拖拽对象不为空
{
dragobj.o.style.left=(e.x-dragobj.xx[0])+"px";// 设置被拖对象的左边距(鼠标距客户端距离-鼠标距Div边框外界的距离)跟随移动
dragobj.o.style.top=(e.y-dragobj.xx[1])+"px";// 设置被拖对象的上边距(鼠标距客户端距离-鼠标距Div边框外界的距离)跟随移动
createtmpl(e);// 移动过程中移到哪插到那
}
}
function getxy(e)
{
var a=new Array();
var t=e.offsetTop;
var l=e.offsetLeft;
var w=e.offsetWidth;
var h=e.offsetHeight;
a[0]=t;a[1]=l;a[2]=w;a[3]=h;
return a;
}
function inner(o,e)
{
var scroll=document.documentElement.scrollTop
// IE document.body.scrollTop
var a=getxy(o);
// a[0]-scroll) 注:当前的div的Y左边减去滚动条滚去页面的高度
if(e.x>a[1]&&e.x<(a[1]+a[2])&&e.y>(a[0]-scroll)&&e.y<(a[0]-scroll+a[3]))// 如果e坐标在o的范围之内
{
if(e.y<((a[0]-scroll)+a[3]/2))// 如果e坐标在o的上半部
return 1;
else
return 2;// 如果e坐标在o的下半部
}
else
return 0;// 如果e坐标在o的范围之外
}
function createtmpl(e)// 在鼠标移动过程中插入临时对象
{
var o=document.getElementsByClassName("elgg-list-item");
for(var i=0;i<o.length;i++)// 遍历内部所有子DIV
{
if(o[i]==dragobj.o)
continue;
var b=inner($(o[i]),e);// 判断e相对$("m"+i)的位置:上半部,下半部,外面
if(b==0)// 在外面
continue;
dragobj.otemp.style.width=$(o[i]).offsetWidth;
if(b==1)// 上半部
{
$(o[i]).parentNode.insertBefore(dragobj.otemp,$(o[i]));// 在$(o[i])的前面插入dragobj.otemp
}
else
{
if($(o[i]).nextSibling==null)// 如果是最后一项
{
$(o[i]).parentNode.appendChild(dragobj.otemp);// 追加到后面
}
else
{
$(o[i]).parentNode.insertBefore(dragobj.otemp,$(o[i]).nextSibling);// 如果在下半部,则在其后一项之前插入
}
}
return
}
}
分享到:
相关推荐
主要介绍了Java实现拖拽列表项的排序功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果;这里提供一种简单的实现方案。 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标上触发事件 (源元素): ondragstart – 用户...
Qt 拖拽功能,可以实现在2个列表框里项目拖拽项目到另一个列表框, 代码是移植qt gui4的,可以在Qt5上运行
/** 拖拽功能实现原理和说明: 1、说明:拖拽实现一般有两种方式,一种是使用html的新特性dragable,但是由于在火狐浏览器上dragable每拖拽一次会打开一个新的标签, 尝试阻止默认行为和冒泡都无法解决,所以使用第...
Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。 具体说明,请参考:学习链接 npm官方演示: vuedraggable特性: 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery...
这个项目可以从多个控件拖拽,并且拖拽过程中显示的影子可以设置各种颜色,位置都是可以的,拖拽的对象包括文本、下拉框、列表等,要研究winform下的控件拖拽功能的朋友可以看看,说明是VB.NET+Winform,不需要的朋友...
基于数据驱动去渲染页面、控制拖拽元素的顺序。 由于我不考虑兼容IE8等旧版本浏览器,拖拽的效果采用了HTML5的拖放(Drag 和 drop)。当然,如果要求兼容性丰富,使用鼠标点击的相关事件也很简单。 实现的效果如下:...
1、ListCtrl和HeaderCtrl支持共用位图底图,可以整个应用程序使用同一张完整底图图片,完美实现换肤等需要;...8、ListCtrl实现列表项拖拽功能,可以鼠标左键拖拽任意一项到某位置后松开,从而将该项插入到该位置处。
利用movable-view, movable-area实现小程序拖拽功能。
JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序
dragslot.js是一款可以对列表自由拖拽排序的jQuery插件。该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果。
这是我在网上看到的一个程序,支持对列表控件中项的拖拽,同时有多种选择方式,点选,单行多行选择,可以对项的位置进行拖动改变。功能还是很全面的。很适合大家学习列表控件。压缩包中有完整的VC++6.0工程,可以...
主要介绍了使用vue-draggable 插件在不同列表之间拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本文要介绍的是一款基于jQuery的图片列表拖拽排序布局插件,我们可以拖拽图片,将图片插入到其他任意图片的前面或者后面,实现图片重新布局的功能,这个功能可以让用户自定义桌面布局,也是jQuery拖拽插件的一个经典...
基于Angular的拖拽排序实现
在Unity里面实现UI窗口的操作,包含拖动,单边拖动缩放,对角拖拽缩放功能
最近在做一个后台系统,有一个功能产品需求是页面分为左右两部分,通过右边的组件列表来动态配置左边的页面视图,并且左边由组件拼装起来的视图,可以实现上下拖拽改变顺序,也可以删除。 根据这个需求我做了下面这...
某个业务实体,如用户管理,常见的菜单对应一个列表页面,顶部为页面级功能按钮,如新增、删除、导出等,中间为查询区域,可以放几个常用的查询条件,最下面则是查询结果,以表格形式展现行列数据。查询结果表格的行...