转载注明出处!!!

转载注明出处!!!

转载注明出处!!!

因为要用到可拖拽表单,个人要比较喜欢自己动手,不怎么喜欢在不懂实现或者原理的情况下用插件,所以查找资料实现了一个。

思路:放入:用mousedown判断鼠标点击的位置是否在触发控件的位置,如果是,mousemove的时候clone一个控件,修改透明度,然后放入容器内的时候remove这个控件,并且在容器内生成一个放入的控件(放入的控件和触发的控件可以不一样)

拖拽:同样的, mousedown的时候判断是哪个控件,mousemove的时候需要放一个占位div放在原有的位置上,并将元素修改透明度然后设置为绝对定位方便拖动,在进行拖动的时候,占位div也会跟着鼠标位置进行改变(判断当前鼠标位置是否是容器内控件的左上角加上控件高度的一半),放下的时候进行判断占位div的位置进行插入。具体看代码吧,这个思路加上的时间距离代码实现的时间有点久远了,所有可能不是很准确,但是大概的思路就是这样了。

ps:要用到拖拽表单功能的,基本上可能都会要更改以往设计数据库方式,这里可以提供给你们一个搜索关键词 表的纵向存储

注释基本上都已经写的很详细了,直接上代码吧。

有什么问题请大神们多多指教

 <!DOCTYPE html>
<html>
<head>
<title>Test</title>
<style type="text/css" >
html,body
{
height:100%;
width:100%;
padding:0;
margin:0;
}
.dialog
{
/* width:250px;
height:250px;*/
position:absolute;
background-color:#ccc;
-webkit-box-shadow:1px 1px 3px #292929;
-moz-box-shadow:1px 1px 3px #292929;
box-shadow:1px 1px 3px #292929;
/*margin:10px;*/
top:50px;
left: 50px;
opacity:1;
}
.dialog-title
{
color:#fff;
background-color:#404040;
font-size:12pt;
font-weight:bold;
padding:4px 6px;
cursor:move;
position:absolute;
top:50px;
left: 50px;
} .dialog-content
{
padding:4px;
cursor:move;
}
.none{
display: none;
}
.box{
width: 200px;
height: 500px;
background-color: gray;
line-height: 30px;
margin: 100px;
}
.place{
width: 200px;
height: 50px;
border: 1px dashed red;
}
</style>
<script type="text/javascript" src="js/devWin.js"></script>
</head>
<body>
<!-- <div id="dlgTest" class="dialog"> -->
<div id = "title" class="dialog-title">Dialog</div>
<div id = "title2" class="dialog-title" style ="top:10px">Dialog</div>
<!-- </div> -->
<a id = "a" href="#">123</a>
<input id = "text" type="text" class = "none">
<div id = "box" class = "box">
<!-- <input type="" name="" placeholder=""> -->
</div>
<div class = "place"></div>
</body>
<script type="text/javascript">
//要传入的变量
//点击触发的对象
var click = document.getElementById("title");
var click2 = document.getElementById("title2");
//放入的容器
var box = document.getElementById("box");
//容器内占位的DIV
var place = document.createElement("div");
place.className = "place";
//往容器内添加的对象
var create = document.createElement("input");
create.type = "text";
var create2 = document.createElement("input");
create2.type = "password";
//是否可以添加多个
var isMany = true;
createWin(click,create,isMany,place,box);
createWin(click2,create2,isMany,place,box);
</script>
</html>

HTML代码

 /**
* author:lzh
* 作用:可拖拽排序表单实现
* 参数:oclick 点击触发事件的对象
* ocreate 出发后在表单中传入的对象
* bisMany 单个oclick对象是否可拖入多个ocreate对象
* oplace 拖入时占位div对象
* obox 拖入的容器,不填则默认为body
*/
function createWin(oclick,ocreate,bisMany,oplace,obox=document.body)
{
//是否点击了触发对象
var isClick = false;
//触发对象是否为容器内的元素
var isIncludeBox = false;
oplace.style.width = obox.offsetWidth-5 + "px";
oplace.style.height = oclick.offsetHeight-5 + "px";
//移动效果的临时元素
var oclickClone;
var oclickDown;
//计算偏移量
var diffObj;
var diffX;
var diffY;
var tmp;
var omove_position;
//点是否包含在容器内
function isInclude(x,y,includeBox=obox)
{
if(x > includeBox.offsetLeft
&& y > includeBox.offsetTop
&& x < includeBox.offsetLeft + includeBox.offsetWidth
&& y < includeBox.offsetTop + includeBox.offsetHeight)
return true;
return false;
}
//移动效果函数
function moveMagic(omove,e)
{
// omove_position = window.getComputedStyle(omove).getPropertyValue('position');
omove.style.opacity = 0.4;
omove.style.position = "absolute";
document.body.appendChild(omove);
omove.style.left = e.clientX-diffX+"px";
omove.style.top = e.clientY-diffY+"px";
}
function getdiff(e)
{
diffObj = e.target;
diffX = e.clientX-diffObj.offsetLeft;
diffY = e.clientY-diffObj.offsetTop;
}
//鼠标按下事件
function down(e)
{
if(isInclude(e.clientX,e.clientY,oclick))
{
isClick = true;
//克隆点击的触发节点
oclickClone=oclick.cloneNode(true);
//计算鼠标的偏移量(如果有margin的话会有偏移现象)
getdiff(e);
}
else
{
getdiff(e);
var child = obox.childNodes;
for(var i=0; i < child.length; i++)
{
//判断鼠标点击是否是容器内的元素,并且不能是占位div(如果不加这个占位div判断会有bug,具体原因不知道)
if(isInclude(e.clientX,e.clientY,child[i])&& child[i] != oplace)
{
isClick = true;
isIncludeBox = true;
//克隆元素用来拖动时的效果
oclickClone = child[i].cloneNode(true);
//克隆元素用来放下
oclickDown = child[i].cloneNode(true);
//按下之后删除元素,并使用移动效果来展示元素
obox.removeChild(child[i]);
moveMagic(oclickClone,e);
//插入占位div来弄
obox.insertBefore(oplace,child[i]);
// flag = true;
break;
}
}
}
}
//鼠标移动事件
function move(e)
{
if(isClick)
{
moveMagic(oclickClone,e);
//判断鼠标是否移动到了容器内部
if(isInclude(e.clientX,e.clientY,obox))
{
//计算容器内的子节点
var child = obox.childNodes;
//一旦进入就可以在首位置插入占位DIV
obox.insertBefore(oplace,child[0]);
//根据鼠标位置放置占位DIV
for(var i = 0; i < child.length; i++)
{
//因为占位DIV是唯一的,所以只需要这样判断即可
if(e.clientY > child[i].offsetTop+child[i].offsetHeight/2)
{
//判断是否拖动到了结尾
if(i != child.length-1)
obox.insertBefore(oplace,child[i+1]);
else
obox.appendChild(oplace);
}
}
}
}
}
//鼠标抬起事件
function up(e)
{
isClick = false;
//鼠标抬起则可以删除临时的拖动效果元素
document.body.removeChild(oclickClone);
//如果将元素放置到了容器内
if(isInclude(e.clientX,e.clientY))
{
var child = obox.childNodes;
//占位div的位置
var insertPlace;
for(var i=0; i<child.length;i++)
{
//确定占位div的位置
if(oplace === child[i])
{
obox.removeChild(child[i]);
insertPlace = i;
break;
}
}
//判断是否可以放置多个
if(!bisMany)
{
if(isIncludeBox)
ocreate = oclickDown;
if(insertPlace==child.length)
obox.appendChild(ocreate);
else
obox.insertBefore(ocreate,child[insertPlace]);
}
else
{
//可以放置多个则需要每个都克隆一下
if(isIncludeBox)
var ocreateClone = oclickDown;
else
var ocreateClone = ocreate.cloneNode(true);
if(insertPlace==child.length)
obox.appendChild(ocreateClone);
else
{
obox.insertBefore(ocreateClone,child[insertPlace]);
}
}
}
else
{
if(isIncludeBox)
{
var child = obox.childNodes;
for(var i=0; i<child.length; i++)
{
if(child[i] === oplace)
{
obox.removeChild(child[i]);
obox.insertBefore(oclickDown,child[i]);
}1
}
}
}
isIncludeBox = false;
}
document.addEventListener('mousemove',move);
document.addEventListener('mousedown',down);
document.addEventListener('mouseup',up);
}

JavaScript代码

纯JS实现可拖拽表单的更多相关文章

  1. formbuild拖拽表单设计器

        formbuild拖拽表单设计器 表单设计器适用于OA系统.问卷调查系统.考试系统等系统,具体使用请前至官网API请点击 formbuild拖拽表单设计器     formbuild迭代几个功 ...

  2. 纯js实现DIV拖拽

    写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...

  3. js监听input等表单输入框的变化事件oninput

    js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...

  4. Fort.js – 时尚、现代的表单填写进度提示效果

    Fort.js 是一款用于时尚.现代的表单填写进度提示效果的 JavaScript 库,你需要做的就是添加表单,剩下的任务就交给 Fort.js 算法了,使用非常简单.提供了Default.Gradi ...

  5. js 节点 document html css 表单节点操作

    js 节点 document html css 表单节点操作 节点操作:访问.属性.创建 (1)节点的访问:firstChild.lastChild.childNodes.parentChild(父子 ...

  6. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  7. 在客户端先通过JS验证后再将表单提交到服务器

    问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...

  8. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

  9. JS Event 鼠标拖拽事件

    <!DOCTYPE html><html> <head>        <meta charset="UTF-8">         ...

随机推荐

  1. python学习GUIwxpython不支持中文输出入的问题

    # -*- coding: utf8 -*- import wx def load(event): file = open(filename.GetValue()) contents.SetValue ...

  2. 手机浏览器,微信中播放amr录音

    由于微信公众号开发中,临时素材只有三天的有效期,但是客户要求所有录音永久保存,永久素材数量又有限制,故只能把录音保存到服务器上.但是存到服务器上有一个问题,手机微信中无法直接播放amr录音.无意中发现 ...

  3. 测试RAC的功能

    1.查看RAC服务状态 node1-> crs_stat -t Name           Type           Target    State     Host ---------- ...

  4. 读《我是IT小小鸟》后有感

    我是一名大一新生,在下半学期开学时,我迎来新课程——<大学生职业生涯规划与就业指导 >.这是一门既新颖,又有许多就业知识和理论的学科.在课上,老师向我们推荐了一本书,名叫<我是IT小 ...

  5. [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能

    一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己的订单状态看到店家已经发货.从上面的业务逻辑可以看出,当用户 ...

  6. 【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)

    这周没什么时间,一开始就在忙一些CefSharp的事情,Win10的研究就放了下来,CefSharp的资料挺少的,但好在是开源的,可以我们便宜的折腾.因为两个的内容都不多,我就合成一篇文章啦. 这还里 ...

  7. H5 缓存机制浅析 移动端 Web 加载性能优化

    腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...

  8. 压力测试工具ab使用

    ab全名是apache bench,是apache自带的一款压力测试工具.它通过创建多个线程来模拟并发,测试目标是基于URL的,因此不论是什么web服务器都可以支持. 使用ab非常简单,进入apach ...

  9. [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果

    List在各种手机应用中都有体现,是安卓UI设计的必修课. 本文将介绍在开发中如何利用ListView和GridView设计自定义列表. 下面分别是用ListView和GridView做的效果: 上面 ...

  10. Ubuntu环境搭建系列—Chrome/JDK/Android篇

    其实每次重装Ubuntu系统的时候都要进行一次基本到环境配置,而且每次总会忘记一些环境配置到东西,所以就写下这个博文,方便自己以后重装系统的时候回顾,同时也给大家做为重装系统后基本环境搭建的参考. 因 ...