`
dlcoco9999
  • 浏览: 37242 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

列表拖拽功能

    博客分类:
  • js
阅读更多
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实现拖拽列表项的排序功能

    主要介绍了Java实现拖拽列表项的排序功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    vue实现列表拖拽排序的功能

    在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果;这里提供一种简单的实现方案。  此例子基于vuecli3 首先,我们先了解一下js原生拖动事件:  在拖动目标上触发事件 (源元素): ondragstart – 用户...

    Qt5 拖拽功能

    Qt 拖拽功能,可以实现在2个列表框里项目拖拽项目到另一个列表框, 代码是移植qt gui4的,可以在Qt5上运行

    拖拽列表.html

    /** 拖拽功能实现原理和说明: 1、说明:拖拽实现一般有两种方式,一种是使用html的新特性dragable,但是由于在火狐浏览器上dragable每拖拽一次会打开一个新的标签, 尝试阻止默认行为和冒泡都无法解决,所以使用第...

    Vue组件Draggable实现拖拽功能

    Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。 具体说明,请参考:学习链接 npm官方演示: vuedraggable特性: 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery...

    从Winform各种空间中拖拽功能实现,并且有拖拽跟随影子

    这个项目可以从多个控件拖拽,并且拖拽过程中显示的影子可以设置各种颜色,位置都是可以的,拖拽的对象包括文本、下拉框、列表等,要研究winform下的控件拖拽功能的朋友可以看看,说明是VB.NET+Winform,不需要的朋友...

    React.js组件实现拖拽排序组件功能过程解析

    基于数据驱动去渲染页面、控制拖拽元素的顺序。 由于我不考虑兼容IE8等旧版本浏览器,拖拽的效果采用了HTML5的拖放(Drag 和 drop)。当然,如果要求兼容性丰富,使用鼠标点击的相关事件也很简单。 实现的效果如下:...

    实现了图片背景(换肤)、外观定制、排序、拖拽功能于一身的CListCtrl(包括内置的CHeaderCtrl)的可复用类及其Demo程序

    1、ListCtrl和HeaderCtrl支持共用位图底图,可以整个应用程序使用同一张完整底图图片,完美实现换肤等需要;...8、ListCtrl实现列表项拖拽功能,可以鼠标左键拖拽任意一项到某位置后松开,从而将该项插入到该位置处。

    微信小程序代码实现:拖拽排序列表

    利用movable-view, movable-area实现小程序拖拽功能。

    JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序

    JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序

    可对列表自由拖拽排序的jQuery插件.zip

    dragslot.js是一款可以对列表自由拖拽排序的jQuery插件。该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果。

    DragDropListCtrl(可拖拽列表控件)

    这是我在网上看到的一个程序,支持对列表控件中项的拖拽,同时有多种选择方式,点选,单行多行选择,可以对项的位置进行拖动改变。功能还是很全面的。很适合大家学习列表控件。压缩包中有完整的VC++6.0工程,可以...

    Vue使用vue-draggable 插件在不同列表之间拖拽功能

    主要介绍了使用vue-draggable 插件在不同列表之间拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    jQuery图片列表拖拽排序布局插件

    本文要介绍的是一款基于jQuery的图片列表拖拽排序布局插件,我们可以拖拽图片,将图片插入到其他任意图片的前面或者后面,实现图片重新布局的功能,这个功能可以让用户自定义桌面布局,也是jQuery拖拽插件的一个经典...

    基于Angular的拖拽排序实现

    基于Angular的拖拽排序实现

    Unity 实现UI窗口拖拽缩放

    在Unity里面实现UI窗口的操作,包含拖动,单边拖动缩放,对角拖拽缩放功能

    Vue拖拽组件列表实现动态页面配置功能

    最近在做一个后台系统,有一个功能产品需求是页面分为左右两部分,通过右边的组件列表来动态配置左边的页面视图,并且左边由组件拼装起来的视图,可以实现上下拖拽改变顺序,也可以删除。 根据这个需求我做了下面这...

    使用vuedraggable实现拖拽式操作实战

    某个业务实体,如用户管理,常见的菜单对应一个列表页面,顶部为页面级功能按钮,如新增、删除、导出等,中间为查询区域,可以放几个常用的查询条件,最下面则是查询结果,以表格形式展现行列数据。查询结果表格的行...

Global site tag (gtag.js) - Google Analytics