整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML的拖拽接口,老程序员经验总结,纯!干!货

什么是拖拽?

本质上来说就是一个对象和一个对象直接传递。

其实学习拖拽,就是学习拖拽事件。

⒉在HTML5中很多元素是不能进行拖拽的,比如说图片和超链接:

在试图拖拽时你会发现一个禁止的符号,如果想拖拽元素,就必须为元素添加draggable="true"。

⒊相关的事件

应用于被拖拽元素的事件

ondrag 应用于拖拽元素,整个拖拽过程都会调用--持续

ondragstart 应用于拖拽元素,当拖拽开始时调用

ondragleave 应用于拖拽元素,当鼠标离开拖拽元素时调用

ondragend 应用于拖拽元素,当拖拽结束时调用

应用于目标元素的事件

ondragenter 应用于目标元素,当拖拽元素进入时调用

ondragover 应用于目标元素,当停留在目标元素上时调用

ondrop 应用于目标元素,当在目标元素上松开鼠标时调用

ondragleave 应用于目标元素,当鼠标离开目标元素时调用

案例:





注意:如果想触发ondrop事件,那么就必须在ondragover事件中阻止浏览器的默认行为。

来源网络,侵权联系删除

私信我或关注微信号:猿来如此呀,回复:学习,获取免费学习资源包。

我们都知道普通的HTML自带的功能相对有限,很多复杂的交互式场景,如果手动去写功能的话会非常的复杂,而且可扩展性差,就拿HTML表格来说,对于初学者或者对于复杂的拖拽式交互编程不熟悉的话会很浪费时间,因此今天就介绍一个第三方的插件——Table-draagger,来轻松实现类似的功能。Table-draagger是用于构建可重排序的拖放表的极简主义纯Javascript库!



Github

https://github.com/sindu12jun/table-dragger


特征

Table-draagger因为其以下几个特征而让拖拽和排序的实现变得如此简单:

  • 非常容易配置
  • 能够同时对列或行进行排序
  • 排序时动画流畅
  • 没有臃肿的依赖
  • 提供触摸事件(意味着在触摸设备可以实现一些你想要的功能)


安装使用

  • 安装

可以在npm上获得它:

npm install table-dragger --save

或者引用压缩的js文件

<script src="../node_modules/table-dragger/dist/table-dragger.min.js"></script>

或者尝试开发中的不稳定版本

npm install table-dragger@next --save

  • 快速入门

请看以下代码:

import tableDragger from 'table-dragger'
tableDragger(el, options?)

<table id="table">
<thead>
<tr>
<th class='handle'>header1</th>
<th class='handle'>header2</th>
</tr>
</thead>
<tbody>
<tr>
<td>conten1</td>
<td>conten2</td>
</tr>
</tbody>
</table>

var el = document.getElementById('table');
var dragger = tableDragger(el, {
mode: 'row',
dragHandler: '.handle',
onlyBody: true,
});
dragger.on('drop',function(from, to){
console(from);
console(to);
});

你可以在不设置任何参数的情况下使用默认的拖拽和排序方式,当然以下是你可以配置的选项:

  • options.mode

1、将mode设置为column,用户拖动和排序表的列

2、将mode设置为row,用户拖动并排序表的行

3、设置mode为free,用户根据点击后鼠标移动的方向拖动行或列。注意,必须在自由模式下指定dragHandler。

  • options.dragHandler

dragHandler是表中的拖动句柄选择器默认情况下,在列模式下,dragHandler是表的第一行;在行模式下,则是第一列。

  • options.onlyBody

在行模式下将onlyBody设置为true时,用户只能在tbody中提升行。

  • API

下面是返回对象的API


tableDragger(document.querySelector('#event-table'), { mode: 'free', dragHandler: '.handle', onlyBody: true })
.on('drag', () => {
console.log('drag');
})
.on('drop', (from, to, el, mode) => {
console.log(`drop ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('shadowMove', (from, to, el, mode) => {
console.log(`move ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('out', (el, mode) => {
console.log(`move out or drop ${el.nodeName} in mode ${mode}`);
});


总结

Table-draagger为我们节省了很多手动封装表格排序和拖拽功能的时间,当然目前很多第三方框架已经实现了类似的功能,这更适用于原生的html表格,你还可以通过一些手段记忆用户拖拽,这只是其中一种思路,Enjoy it!~

拽成为一项标准也是近几年的事,属于HTML5中的一部分,作为一种交互行为,拖拽是被广泛应用再界面软件中的,例如桌面应用,word、QQ软件都有拖拽行为。

在HTML5标准实施之前,拖拽也是被广泛使用的,web开发者将click、mouseover,mousemove组合起来实现拖拽逻辑,过程略显冗余和繁琐。

一言蔽之,HTML5的出现让拖拽开发变得简单

先来一张流程图

下图描绘了拖拽的流程.

要点概括总结

结合上图,我们梳理下知识点,做个拆分与解析。

一共有哪些事件

  • 拖: dragstart , drag , dragend
  • 放: dragenter , dragover , dragleave , drop

哪些实体可以被拖

draggable
wordContainerEle.onselectstart = event => false;

这意味着:

  • 元素 默认禁止拖拽 (貌似都是),需要手动设置draggable属性为true。
  • 文字默认都是能选中的,这个大家都习以为常了。

需要说明的是,一个元素被设置draggable之后,里面的文本就无法被选中了(chrome测试如此)。

关于放,有哪些限制?

  • dragenter :都可以。
  • dragover :都可以
  • dragleave :都可以
  • drop :只有在 dragover监听中阻止默认行为 ,才能触发drop

拖放会冒泡嘛?

答案是肯定的。假设一个父元素包含一个子元素,理所当然地,用户拖子元素也是间接的拖动父元素的过程。