本文首发于个人我的博客:cherryblog.site/ ,欢迎你们前去参观
本文项目地址,sortable插件地址:github.com/sunshine940…
demo地址:github.com/sunshine940…javascript
在写咱们后台的管理程序中须要有一个拖放的功能,而后咱们有一个这样的功能,实现11个固定且大小不一的div互换,效果以下
css
做为一个小菜鸟,听到这样的消息我是蒙逼的= =,在网上找到一个插件,功能挺强大的
html
插件地址:github.com/sunshine940…java
可是这个插件只能拖动和放置,不能交换,也就是只能将div插入在其余div前面,其他的向后推移,而且不能作到交换div中的内容,而div容器不变的条件,而后我就和其余同事商量了一下交换两个div中的数据要怎么处理,而后同事说这个就比较麻烦了= =。须要写死div,而后先记录鼠标拖动前的div中的内容,而后判断鼠标放下的位置,在哪个div的范围内,再交换两个的数据= =,真正作起来还不知道有什么坑。听着都怕,因而就暂且搁置了这个功能,直到有一天非作不可了,我百度了一下“怎么交换两个div”,而后找到了一个demo,天啦噜~整个实现过程所有代码50行不到,js代码以后十几行,整个过程不到半个小时就解决了,★,°:.☆( ̄▽ ̄)/$:.°★。撒花!效果以下:
git
demo地址:github.com/sunshine940…
查看代码,发现思路以下:github
本例的代码以下bash
<!DOCTYPE html>
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
#div1
{float:left; width:100px; height:35px; margin:10px;padding:10px;border:1px solid #aaaaaa;}
#div2
{float:left; width:200px; height:135px; margin:10px;padding:10px;border:1px solid #aaaaaa;}
</style>
<script type="text/javascript">
function allowDrop(ev)
{
ev.preventDefault();
}
var srcdiv = null;
function drag(ev,divdom)
{
srcdiv=divdom;
ev.dataTransfer.setData("text/html",divdom.innerHTML);
}
function drop(ev,divdom)
{
ev.preventDefault();
if(srcdiv != divdom){
srcdiv.innerHTML = divdom.innerHTML;
divdom.innerHTML=ev.dataTransfer.getData("text/html");
}
}
</script>
</head>
<body>
<div id="div1" ondrop="drop(event,this)" ondragover="allowDrop(event)" draggable="true" ondragstart="drag(event, this)">
<p>ni hao!</p>
</div>
<div id="div2" ondrop="drop(event,this)" ondragover="allowDrop(event)" draggable="true" ondragstart="drag(event, this)">
<p>Hello world!</p>
</div>
</body>
</html>复制代码
拖放是一种常见的特性,即抓取对象之后拖到另外一个位置。
在 HTML5 中,拖放是标准的一部分,任何元素都可以拖放。dom
首先,为了使元素可拖动,把 draggable 属性设置为 true :<div draggable="true"></div>
函数
ondragstart 属性调用了一个函数,drag(event,this),它规定了被拖动的数据。dataTransfer.setData() 方法设置被拖数据的数据类型和值,在这个例子中,数据类型是 "text/html",值是可拖动元素的innerHTMLui
function drag(ev,divdom){
srcdiv=divdom;
ev.dataTransfer.setData("text/html",divdom.innerHTML);
}复制代码
ondragover 事件规定在何处放置被拖动的数据。
默认地,没法将数据/元素放置到其余元素中。若是须要设置容许放置,咱们必须阻止对元素的默认处理方式。
这要经过调用 ondragover 事件的 event.preventDefault() 方法:
event.preventDefault()
function allowDrop(ev){
ev.preventDefault();
}复制代码
当放置被拖数据时,会发生 drop 事件。
在上面的例子中,ondrop 属性调用了一个函数,drop(event):
function drop(ev,divdom){
ev.preventDefault();
if(srcdiv != divdom){
srcdiv.innerHTML = divdom.innerHTML;
divdom.innerHTML=ev.dataTransfer.getData("text/html");
}
}复制代码