javascript实现表格劈分拖拽

Vue.Draggable拖拽与el-table表格拖拽 然后就会去网上百度一些vue拖拽相关的插件,比如vue-draggable它是基于sortable.js的二次封装,兼容了移动端,不过我们写toB项目的时候,可能只有pc端需要拖拽功能,所以这期就结合vue教大家手写实现拖拽。Elment ui中el-table 实现表格拖拽_el-table 拖拽_番茄and西红柿的博客-优快云博客。vue中针对el-table表格的拖拽_el-table 拖拽_爱前端的茂茂的博客-优快云博客。VUE 实现拖拽效果_vue 拖拽_alokka的博客-优快云博客。 阅读详情

Javascript的特点是dom的处理与网页效果,大多数情况我们只用到了这个语言的最简单的功能,比如制作图片轮播/网页的tab等等,这篇文章将向你展示如何在自己的网页上制作拖拽.

有很多理由让你的网站加入拖拽功能,最简单的一个是数据重组.例如:你有一个序列的内容让用户排序,用户需要给每个条目进行输入或者用select选择,替代前面这个方法的就是拖拽.或许你的网站也需要一个用户可以拖动的导航窗口!那么这些效果都是很简单:因为你可以很容易的实现!

网页上实现拖拽其实也不是很复杂.第一你需要知道鼠标坐标,第二你需要知道用户鼠标点击一个网页元素并实现拖拽,最后我们要实现移动这个元素.

获取鼠标移动信息

第一我们需要获取鼠标的坐标.我们加一个用户函数到document.onmousemove就可以了:

document.onmousemove = mouseMove;
实现脚本:
<script>
function mouseMove(ev){
ev = ev || window.event;
var mousePos = mouseCoords(ev);
document.getElementById('xxx').value = mousePos.x;
document.getElementById('yyy').value = mousePos.y;
}
function mouseCoords(ev){
if(ev.pageX || ev.pageY){
return {x:ev.pageX, y:ev.pageY};
}
return {
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:ev.clientY + document.body.scrollTop  - document.body.clientTop
};
}
document.onmousemove = mouseMove;
</script>
<input id=xxx type=text>
<br>
<input id=yyy type=text>


你首先要声明一个evnet对象.不论何时你移动鼠标/点击/按键等等,会对应一个event的事件.在Internet Explorer里event是全局变量,会被存储在window.event里. 在firefox中,或者其他浏览器,event事件会被相应的自定义函数获取.当我们将mouseMove函数赋值于document.onmousemove,mouseMove会获取鼠标移动事件.

(ev = ev || window.event) 这样让ev在所有浏览器下获取了event事件,在Firefox下"||window.event"将不起作用,因为ev已经有了赋值.在MSIE下ev是空的,所以ev将设置为window.event.

因为我们在这篇文章中需要多次获取鼠标坐标,所以我们设计了mouseCoords这个函数,它只包含了一个参数,就是the event.

我们需要运行在MSIE与Firefox为首的其他浏览器下.Firefox以event.pageX和event.pageY来代表鼠标相应于文档左上角的位置.如果你有一个500*500的窗口,而且你的鼠标在正中间,那么paegX和pageY将是250,当你将页面往下滚动500px,那么pageY将是750.此时pageX不变,还是250.

MSIE和这个相反,MSIE将event.clientX与event.clientY来代表鼠标与ie窗口的位置,并不是文档.当我们有一个500*500的窗口,鼠标在正中间,那么clientX与clientY也是250,如果你垂直滚动窗口到任何位置,clientY仍然是250,因为相对ie窗口并没有变化.想得到正确的结果,我们必须加入scrollLeft与scrollTop这两个相对于文档鼠标位置的属性.最后,由于MSIE并没有0,0的文档起始位置,因为通常会设置2px的边框在周围,边框的宽度包含在document.body.clientLeft与clientTop这两个属性中,我们再加入这些到鼠标的位置中.

很幸运,这样mouseCoords函数就完成了,我们不再为坐标的事操心了.

捕捉鼠标点击

下次我们将知道鼠标何时点击与何时放开.如果我们跳过这一步,我们在做拖拽时将永远不知道鼠标移动上面时的动作,这将是恼人的与违反直觉的.

这里有两个函数帮助我们:onmousedown与onmouseup.我们预先设置函数来接收document.onmousemove,这样看起来很象我们会获取document.onmousedown与document.onmouseup.但是当我们获取document.onmousedown时,我们同时获取了任何对象的点击属性如:text,images,tables等等.我们只想获取那些需要拖拽的属性,所以我们设置函数来获取我们需要移动的对象。实现脚本:

<script>
function mouseDown(ev){
ev = ev || window.event;
var target = ev.target || ev.srcElement;
if(target.onmousedown || target.getAttribute('DragObj')){
return false;
}
}
function makeClickable(item){
if(!item) return;
item.onmousedown = function(ev){
document.getElementById('ClickImage').value = this.name;
}
}
document.onmousedown = mouseDown;
window.onload = function(){
makeClickable(document.getElementById('ClickImage1'));
makeClickable(document.getElementById('ClickImage2'));
makeClickable(document.getElementById('ClickImage3'));
makeClickable(document.getElementById('ClickImage4'));
}</script>
<FIELDSET id=Demo3>
<h3>
Demo - Click any image
</h3>
<IMG id=ClickImage1
src="http://www.webreference.com/programming/javascript/mk/column2/Dragging and Dropping in JavaScript_files/drag_drop_spade.gif"
name=Spade><IMG id=ClickImage2
src="http://www.webreference.com/programming/javascript/mk/column2/Dragging and Dropping in JavaScript_files/drag_drop_heart.gif"
name=Heart><IMG id=ClickImage3
src="http://www.webreference.com/programming/javascript/mk/column2/Dragging and Dropping in JavaScript_files/drag_drop_diamond.gif"
name=Diamond><IMG id=ClickImage4
src="http://www.webreference.com/programming/javascript/mk/column2/Dragging and Dropping in JavaScript_files/drag_drop_club.gif"
name=Club>
<BR>You clicked on: <INPUT id=ClickImage type="text"> </FIELDSET>

移动一个元素

我们知道了怎么捕捉鼠标移动与点击.剩下的就是移动元素了.首先,要确定一个明确的页面位置,css样式表要用'absolute'.设置元素绝对位置意味着我们可以用样式表的.top和.left来定位,可以用相对位置来定位了.我们将鼠标的移动全部相对页面top-left,基于这点,我们可以进行下一步了.

当我们定义item.style.position='absolute',所有的操作都是改变left坐标与top坐标,然后它移动了.

document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;
var dragObject  = null;
var mouseOffset = null;
function getMouseOffset(target, ev){
ev = ev || window.event;
var docPos    = getPosition(target);
var mousePos  = mouseCoords(ev);
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}
function getPosition(e){
var left = 0;
var top  = 0;
while (e.offsetParent){
left += e.offsetLeft;
top  += e.offsetTop;
e     = e.offsetParent;
}
left += e.offsetLeft;
top  += e.offsetTop;
return {x:left, y:top};
}
function mouseMove(ev){
ev           = ev || window.event;
var mousePos = mouseCoords(ev);
if(dragObject){
dragObject.style.position = 'absolute';
dragObject.style.top      = mousePos.y - mouseOffset.y;
dragObject.style.left     = mousePos.x - mouseOffset.x;
return false;
}
}
function mouseUp(){
dragObject = null;
}
function makeDraggable(item){
if(!item) return;
item.onmousedown = function(ev){
dragObject  = this;
mouseOffset = getMouseOffset(this, ev);
return false;
}
}

实现上面效果的代码,注意将<>的全角换成半角
<script>
var iMouseDown  = false;
var dragObject  = null;
var curTarget   = null;
function makeDraggable(item){
if(!item) return;
item.onmousedown = function(ev){
dragObject  = this;
mouseOffset = getMouseOffset(this, ev);
return false;
}
}
function getMouseOffset(target, ev){
ev = ev || window.event;
var docPos    = getPosition(target);
var mousePos  = mouseCoords(ev);
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}
function getPosition(e){
var left = 0;
var top  = 0;
while (e.offsetParent){
left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
e     = e.offsetParent;
}
left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
return {x:left, y:top};
}
function mouseCoords(ev){
if(ev.pageX || ev.pageY){
return {x:ev.pageX, y:ev.pageY};
}
return {
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:ev.clientY + document.body.scrollTop  - document.body.clientTop
};
}
function mouseDown(ev){
ev         = ev || window.event;
var target = ev.target || ev.srcElement;
if(target.onmousedown || target.getAttribute('DragObj')){
return false;
}
}
function mouseUp(ev){
dragObject = null;
iMouseDown = false;
}
function mouseMove(ev){
ev         = ev || window.event;
/*
We are setting target to whatever item the mouse is currently on
Firefox uses event.target here, MSIE uses event.srcElement
*/
var target   = ev.target || ev.srcElement;
var mousePos = mouseCoords(ev);
if(dragObject){
dragObject.style.position = 'absolute';
dragObject.style.top      = mousePos.y - mouseOffset.y;
dragObject.style.left     = mousePos.x - mouseOffset.x;
}
// track the current mouse state so we can compare against it next time
lMouseState = iMouseDown;
// this prevents items on the page from being highlighted while dragging
if(curTarget || dragObject) return false;
}
document.onmousemove = mouseMove;
document.onmousedown = mouseDown;
document.onmouseup   = mouseUp;
window.onload = function() {
makeDraggable(document.getElementById('DragImage5'));
makeDraggable(document.getElementById('DragImage6'));
makeDraggable(document.getElementById('DragImage7'));
makeDraggable(document.getElementById('DragImage8'));
}
</script>
<FIELDSET id=Demo5 style="HEIGHT: 70px"><h3>Demo - Drag any of the
images</h3><IMG id=DragImage5
src="images/drag_drop_spade.gif"><IMG
id=DragImage6
src="images/drag_drop_heart.gif"><IMG
id=DragImage7
src="images/drag_drop_diamond.gif"><IMG
id=DragImage8
src="images/drag_drop_club.gif"> </FIELDSET>
表格拖拽、树状拖拽的各种方法 配置项:Sortable.js是一款优秀的js拖拽库,支持ie9及以上版本ie浏览器和现代浏览器,也可以运行在移动触摸设备中。不依赖jQuery。支持 Meteor、AngularJS、React、Vue、Knockout框架和任何CSS库,如Bootstrap、Element UI。你可以用来拖拽div、table等元素。第一步:安装第二步:使用方法完整代码。 阅读详情

相关推荐

vue elementUi+sortable.js实现嵌套表格拖拽

首先说下项目需求,一个多层嵌套的表格,行可以进行拖拽排序,但不能跨主级去拖拽,下拉可以异步获取数据,考虑了很久,还是用最熟悉的vue+element来做,但是element没有拖拽排序的功能,所以在此基础上加入sortable.js去实现拖拽功能。 后台返回的排序规则是 每个数据都带有3个属性 id next prev ,用这3个属性实时的去更新排序 id表示这一条数据的id next表示下一条数据的id prev表示上一条数据的id html部分 data部分 flattArray:.

s1012544671的博客 3981

原生js实现 拖拽改变 table表格列宽

【代码】原生js实现 拖拽改变 table表格列宽。

weixin_57456011的博客 1170

elementUI table组件-表格嵌套拖拽

表格嵌套拖拽 elementui+vue+sortable.js实现表格嵌套拖拽 1.sortable.js 2.贴代码:html部分 注:为了获取每个表格dom,所以需要给表格id,但是嵌套的表格是根据数据随机渲染出来的,所以要拼接动态id,便于获取 3. 方法调用 4.定义方法 (1)外表格-拖拽方法 (2)内表格-拖拽 (3)外表格-展开-监听事件:获取内表格数据 ps: /*行拖拽-外表格*/ rowDropOut(){ ...

weixin_42618492的博客 2994

JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行。博主用了半天时间研究了下,效果是出来了,但是感觉不尽如人意。先把它分享出来,以后想到更好的办法再优化吧。 一、效果展示 1、拖动前   2、拖动中 3、拖动后 4、撤销回到拖动前状态   二、需求分析 通过上篇我们知道...

weixin_34055910的博客 409

javascript实现表格的单元格拖动排序

javascript实现表格的单元格拖动排序,对实现图片的拖动排序有启发

js实现table列头拖拽

js实现table列头拖拽,。。。。。。

原生js/jquery 实现拖拽功能

原生JS实现 <!doctype html> <html> <head> <meta charset="utf-8"> <title>拖拽功能</title> </head> <body> <div style="width:100px;height: 10...

有酒醉三生丶 1444

鼠标拖动动态改变表格的宽度的js脚本 兼容ie/firefox

table拖动(兼容Firefox 3.5/IE6),固定表格宽度 table拖动(兼容Firefox 3.5/IE6),固定表格宽度 序号 公司名称 订单客户 部门 业务员 交款方式 1 软件开发网 jb51.net 广告部 王天一 现金 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]上面代码是本人从网上搜集的,并非本人编写,特此声明。下面附上两个是IE only的,大家都可以参考下。 拖动列宽的表格 序号 公司名称 订单客户 部门 业务员 交款方式 1 中国电信 订单客户名称 广告部 王天一 现

js字符串转数组中的split()方法

split() 方法用于把一个字符串分割成字符串数组

weixin_40003755的博客 1万+

jQuery实现鼠标可拖动调整表格列宽度

主要介绍了通过jQuery实现鼠标可拖动调整表格列宽度,需要的朋友可以参考下

表格列自由拖动排序js代码

一款非常不错的表格列自由拖动排序js代码,单击鼠标长按表格列自由拖动排序,互换列排序代码,点击表格头部支持表格数据升降大小排序效果。

基于Vue实现跨表格(单选、多选表格项,单表格限制)相互拖拽

前言 今天,我们将使用Vue.js来实现一个跨表格相互拖拽。在开发这个业务之前呢,也调研了网上很多解决方案,但个人感觉不太符合现在做的这个需求。所以,压根就自己再开发一套,方便以后维护。 什么需求呢?就是多个表格之间可以实现相互拖拽,即A表格中的表格项可以拖拽到B表格,B表格的表格项可以拖拽到C表格,并且它们之间可以单选、多选表格项相互拖拽。然后,D表格加以限制,每次只能够拖入一项,需输入密码,密码正确后,被拖入的一项替换D表格中的表格项,被替换的D表格项放入A表格,只能被替换,不能被删除。 文字太枯燥,我

主要领域:前端开发 4821

拖动table标题实现改变td的大小(css+js代码)

拖动列宽的表格table标题同时改变td的大小,本文将以实例演示为大家呈现,感兴趣的朋友可以参考下哈,希望对你学习js或者css有所帮助

【ElementUI实现table表格行拖拽切换顺序】

原生方法实现table表格拖拽切换

电竞蒋劲夫的博客 3002

实战对比:Lmcache+vllm将KVcache卸载到CPU和SSD的性能差异(附完整配置)

本文通过实战对比Lmcache与vLLM在KV Cache卸载到CPU和SSD的性能差异,详细解析了配置优化、基准测试及高级调优策略。实验显示,CPU卸载在低并发下表现优异,而SSD方案在高并发场景中更具性价比优势,为LLM推理任务提供了高效的存储解决方案。

weixin_30664051的博客 700

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 427

Sortablejs+element表格实现拖拽

原理:把树形的结构数据在拖拽时转为列表,因为不允许跨级拖拽,只要把拖拽的同一级数据进行排列,结果发给后台,返回最新数据。2.可以自己手写表格,使用vue.draggable.next插件,参看。1.树形结构表格任意拖拽,点击保存之后才发送请求,大家可以看。1.每次拖动都进行保存,把数据发给后台之后在请求最新的数据。最开心的事情就是—这个bug我解决了,学无止境!2.列表的数据转树形的数据,排序完把顺序返回后台。3.把树形的表格的每一个父级看成一个组,然后参考。ps:插件用的不一样,不过功能是一致的。

susanliy的博客 5521

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 428

可拖拽树形结构表格、正常拖拽表格

复杂表格,支持表格展示,树形表格展示,对表格进行拖拽排序,以及表格排序,表格拖拽排序,自定义表格内容,是一个基于vue的表格插件 话不多说 ,直接贴源码地址:https://github.com/zhjing1019/ComplexGrid 树形表格拖拽排序 组件的使用 下载组件 npm install complex-grid 引用组件 im...

zhangjing1019的博客 7182

【异常】Error loading ASGI app. Could not import module ‘main‘

出现或。

奶爸的编程之路,也就一周冷个三天 1854

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 650

ElementUI el-table + sortable.js实现表格行拖拽功能

因项目需要,需要实现表格行拖拽,但是ElementUI表格组件未提供此功能,经查阅资料,打算引入Sortable.js(一款轻量级的拖放排序列表的js插件)实现。 1. npm安装引入 然后可以在main.js中或者需要用到拖拽功能的.vue文件中引入 2. HTML部分 3. js部分 首先不要忘记步骤1的引入,然后在页面渲染完成之后调用拖拽方法。如果是在修改/新增弹窗中的表格,可以在新增/...

qq_37471721的博客 3487

PHPStorm携手ThinkPHP8:开启高效开发之旅

本文围绕使用 PHPStorm 进行 ThinkPHP8 开发展开,先介绍开发环境搭建与 Xdebug 配置,再阐述 PHPStorm 集成 ThinkPHP8 的步骤,包括项目导入、解释器和服务器配置。还讲解了项目开发基础、数据库操作、高级技巧、调试处理及部署上线等内容,为开发者提供了从环境搭建到项目上线的完整指引,助力高效开展 ThinkPHP8 开发工作。

邓邓子的博客 1545
上一篇: 水晶报表函数大全--数字函数篇
下一篇: tabbedPanel标签
memory_xj
博客等级 码龄24年 44粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值