html5已将拖放做为功能的一部分,任何元素都可以拖放。此处已表格为例,纯属练习用。
由于本人是做电信行业的,这个例子中的数据也以电信行业产品作为数据。
【功能】1 实现资费、优惠元素组装成包(将资费控件、优惠控件拖放到资费包、优惠包上)
2 实现将资费包、优惠包拖放到产品上
注:资费控件、优惠控件、资费包、优惠包、产品在界面上都是以表格形式展示的。
组装后,界面效果如下:
主界面html如下:
<html> <head> <style type="text/css"></style> <link rel="stylesheet" type="text/css" href="table_drag.css"></link> <title>table_drag</title> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> <script type="text/javascript" src="Drag.js"></script> </head> <body> <div>你可以将资费、优惠拖拽到资费包、优惠包上,看看效果; 拖拽资费包、优惠包到你喜欢的位置。在尝试下将包拖拽到产品上!!!</div> <div id ="sidebar"> <div class="favor_module_wrapper"> <table class="module" id="favor_module"> <tr> <th>优惠 </th> </tr> </table> </div> <div class="discnt_module_wrapper"> <table class="module" id="discnt_module"> <tr> <th>资费 </th> </tr> </table> </div> <div class="other"></div> </div> <div> <table class="control" > <thead> <tr> <th>GPRS优惠包 </th> </tr> </thead> <tbody > <tr class="tbr"> <td>10元GPRS</input> </td> </tr > <tr class="tbr"> <td>20元GPRS </td> </tr> <tr class="tbr"> <td>30元GPRS </td> </tr> </tbody> </table> </div> <div> <table class="control"> <thead> <tr> <th>短信包优惠包 </th> </tr> </thead> <tbody > <tr class="tbr"> <td>短信10元 </td> </tr > <tr class="tbr"> <td>短信20元 </td> </tr> <tr class="tbr"> <td>短信30元 </td> </tr> </tbody> </table> </div> <div> <table class="control"> <thead> <tr> <th>66元3G主资费包 </th> </tr> </thead> <tbody > <tr > <td>66元3G主资费 </td> </tr > </tbody> </table> </div> <div> <table class="product"> <thead> <tr> <th> 66元3G套餐 </th> </tr> </thead> <tbody> <tr> </tr> </tbody> </table> </div> </body> </html>
Drag.js 代码如下:
写道
$(document).ready(function() {
var m_drag = new Drag(1,7);
});
//oh 是否只能拖动head
//max_row 表格存在row行后,出现滚动条
function Drag(oh,max_row)
{
var _this=this;
var rect={
x:0,
y:0,
width:0,
height:0
};
var m_p = {
x:0,
y:0
};
var m_onlyhead;
var m_row;
var init=function()
{
m_onlyhead = oh;
m_row = max_row;
$(".module ,.control,.product").attr("draggable","true");
$(".module ,.control,.product").bind({
dragstart:dragstart,
dragend:dragend
});
};
var getTablePosition = function(obj)
{
var t_rect={
x:0,
y:0,
width:0,
height:0
};
t_rect.x=obj.getBoundingClientRect().left;
t_rect.y=obj.getBoundingClientRect().top;
t_rect.width=obj.getBoundingClientRect().right - obj.getBoundingClientRect().left;
t_rect.height=obj.getBoundingClientRect().bottom - obj.getBoundingClientRect().top;
return t_rect;
};
var dragstart = function (e)
{
console.log("dragstart");
var obj = this;
rect =getTablePosition(obj);
console.log("rect=("+rect.x +"," + rect.y+","
+rect.width+","+rect.height+")");
//如果仅仅拖动head的时候,才允许拖动
if(1==m_onlyhead){
var f = e.originalEvent;
var obj_head=this.tHead;
if (obj_head)
{
var f = e.originalEvent;
m_p = getMousePoint(f);
var head_rect = getTablePosition(obj_head);
console.log("head_rect=("+head_rect.x +"," + head_rect.y+","
+head_rect.width+","+head_rect.height+")");
var is_on = is_inRect(m_p,head_rect)
if(1 != is_on)
{
f.preventDefault();
}
}
}
};
var dragend = function (e)
{
console.log("dragend");
console.log(this);
var f = e.originalEvent;
m_p = getMousePoint(f);
var obj = this;
rect = getTablePosition(obj);
rect.x=m_p.x;
rect.y=m_p.y;
rect.width=m_p.x+rect.width;
rect.height=m_p.y+rect.height;
console.log("rect=("+rect.x +"," + rect.y+","
+rect.width+","+rect.height+")");
console.log(this.clientLeft,this.clientTop);
$(obj).not(".module").css({"position":"absolute","left": rect.x+"px" ,"top":rect.y+"px"});
if ( "product"==$(obj).attr("class") )
{
return;
}
if( "control"==$(obj).attr("class") )
{
$(".product").each(function(){
var p_tt_rect =getTablePosition(this);
var p_is_on = is_inRect(m_p,p_tt_rect)
if(1 == p_is_on)
{
console.log(p_is_on);
m_cols = $(this).find("tbody").first().find("tr").first().children("td").size()+1;
$(this).first("thead").find("th").attr("colspan",m_cols);
var p_str_html = $(obj).html();
if(1==m_cols)
{
$(this).find("tbody").first().find("tr").first().html("<td><table>"+p_str_html+"</table></td>");
}
else
{
$(this).find("tbody").first().find("tr").first().children("td").last().after("<td><table>"+p_str_html+"</table></td>");
}
$(obj).remove();
}
});
}
$(".control").each(function(){
if (obj == this)
{
return ;
}
var tt_rect =getTablePosition(this);
var is_on = is_inRect(m_p,tt_rect)
if(1 == is_on)
{
var str_html="<tr><td width='40' height='20'><input type='text' ";
var co = $(obj).css("background-color");
if (co)
{
str_html = str_html +"style=" +"'background-color:"+co +"'";
}
var obj_id = $(obj).attr("id");
if("favor_module" == obj_id)
{
str_html = str_html + "placeholder='请输入优惠名称' ";
}
else if("discnt_module" == obj_id )
{
str_html = str_html + "placeholder='请输入资费名称' ";
}
str_html = str_html + "></input></td></tr>";
$(this).find("tr").last().after(str_html);
if (m_row <= $(this).find("tbody").find("tr").size() )
{
console.log($(this).find("tr"));
var v_obj = $(this).find("tr");
var v_h = getRowHeight(v_obj, m_row);
$(this).find("tbody").css({"height": v_h,"overflow-y":"auto"} );
}
}
});
};
var getRowHeight= function( obj , r)
{
var h=0;
var o;
var i=0;
o=obj.toArray();
while(i <r)
{
h = h + o[i].clientHeight;
i = i+1;
}
return h;
}
var getMousePoint= function (ev) {
var point = {
x:0,
y:0
};
// 如果浏览器支持 pageYOffset, 通过 pageXOffset 和 pageYOffset 获取页面和视窗之间的距离
if(typeof window.pageYOffset != 'undefined') {
point.x = window.pageXOffset;
point.y = window.pageYOffset;
}
// 如果浏览器支持 compatMode, 并且指定了 DOCTYPE, 通过 documentElement 获取滚动距离作为页面和视窗间的距离
// IE 中, 当页面指定 DOCTYPE, compatMode 的值是 CSS1Compat, 否则 compatMode 的值是 BackCompat
else if(typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
point.x = document.documentElement.scrollLeft;
point.y = document.documentElement.scrollTop;
}
// 如果浏览器支持 document.body, 可以通过 document.body 来获取滚动高度
else if(typeof document.body != 'undefined') {
point.x = document.body.scrollLeft;
point.y = document.body.scrollTop;
}
// 加上鼠标在视窗中的位置
point.x += ev.clientX;
point.y += ev.clientY;
// 返回鼠标在视窗中的位置
return point;
};
var is_inRect = function (m_point,rect)
{
if ( ( rect.x <= m_point.x )
&& ( m_point.x <= rect.x + rect.width )
&& ( rect.y <= m_point.y )
&& ( m_point.y <= rect.y + rect.height )
)
return 1;
else
return 0;
};
init();
}
var m_drag = new Drag(1,7);
});
//oh 是否只能拖动head
//max_row 表格存在row行后,出现滚动条
function Drag(oh,max_row)
{
var _this=this;
var rect={
x:0,
y:0,
width:0,
height:0
};
var m_p = {
x:0,
y:0
};
var m_onlyhead;
var m_row;
var init=function()
{
m_onlyhead = oh;
m_row = max_row;
$(".module ,.control,.product").attr("draggable","true");
$(".module ,.control,.product").bind({
dragstart:dragstart,
dragend:dragend
});
};
var getTablePosition = function(obj)
{
var t_rect={
x:0,
y:0,
width:0,
height:0
};
t_rect.x=obj.getBoundingClientRect().left;
t_rect.y=obj.getBoundingClientRect().top;
t_rect.width=obj.getBoundingClientRect().right - obj.getBoundingClientRect().left;
t_rect.height=obj.getBoundingClientRect().bottom - obj.getBoundingClientRect().top;
return t_rect;
};
var dragstart = function (e)
{
console.log("dragstart");
var obj = this;
rect =getTablePosition(obj);
console.log("rect=("+rect.x +"," + rect.y+","
+rect.width+","+rect.height+")");
//如果仅仅拖动head的时候,才允许拖动
if(1==m_onlyhead){
var f = e.originalEvent;
var obj_head=this.tHead;
if (obj_head)
{
var f = e.originalEvent;
m_p = getMousePoint(f);
var head_rect = getTablePosition(obj_head);
console.log("head_rect=("+head_rect.x +"," + head_rect.y+","
+head_rect.width+","+head_rect.height+")");
var is_on = is_inRect(m_p,head_rect)
if(1 != is_on)
{
f.preventDefault();
}
}
}
};
var dragend = function (e)
{
console.log("dragend");
console.log(this);
var f = e.originalEvent;
m_p = getMousePoint(f);
var obj = this;
rect = getTablePosition(obj);
rect.x=m_p.x;
rect.y=m_p.y;
rect.width=m_p.x+rect.width;
rect.height=m_p.y+rect.height;
console.log("rect=("+rect.x +"," + rect.y+","
+rect.width+","+rect.height+")");
console.log(this.clientLeft,this.clientTop);
$(obj).not(".module").css({"position":"absolute","left": rect.x+"px" ,"top":rect.y+"px"});
if ( "product"==$(obj).attr("class") )
{
return;
}
if( "control"==$(obj).attr("class") )
{
$(".product").each(function(){
var p_tt_rect =getTablePosition(this);
var p_is_on = is_inRect(m_p,p_tt_rect)
if(1 == p_is_on)
{
console.log(p_is_on);
m_cols = $(this).find("tbody").first().find("tr").first().children("td").size()+1;
$(this).first("thead").find("th").attr("colspan",m_cols);
var p_str_html = $(obj).html();
if(1==m_cols)
{
$(this).find("tbody").first().find("tr").first().html("<td><table>"+p_str_html+"</table></td>");
}
else
{
$(this).find("tbody").first().find("tr").first().children("td").last().after("<td><table>"+p_str_html+"</table></td>");
}
$(obj).remove();
}
});
}
$(".control").each(function(){
if (obj == this)
{
return ;
}
var tt_rect =getTablePosition(this);
var is_on = is_inRect(m_p,tt_rect)
if(1 == is_on)
{
var str_html="<tr><td width='40' height='20'><input type='text' ";
var co = $(obj).css("background-color");
if (co)
{
str_html = str_html +"style=" +"'background-color:"+co +"'";
}
var obj_id = $(obj).attr("id");
if("favor_module" == obj_id)
{
str_html = str_html + "placeholder='请输入优惠名称' ";
}
else if("discnt_module" == obj_id )
{
str_html = str_html + "placeholder='请输入资费名称' ";
}
str_html = str_html + "></input></td></tr>";
$(this).find("tr").last().after(str_html);
if (m_row <= $(this).find("tbody").find("tr").size() )
{
console.log($(this).find("tr"));
var v_obj = $(this).find("tr");
var v_h = getRowHeight(v_obj, m_row);
$(this).find("tbody").css({"height": v_h,"overflow-y":"auto"} );
}
}
});
};
var getRowHeight= function( obj , r)
{
var h=0;
var o;
var i=0;
o=obj.toArray();
while(i <r)
{
h = h + o[i].clientHeight;
i = i+1;
}
return h;
}
var getMousePoint= function (ev) {
var point = {
x:0,
y:0
};
// 如果浏览器支持 pageYOffset, 通过 pageXOffset 和 pageYOffset 获取页面和视窗之间的距离
if(typeof window.pageYOffset != 'undefined') {
point.x = window.pageXOffset;
point.y = window.pageYOffset;
}
// 如果浏览器支持 compatMode, 并且指定了 DOCTYPE, 通过 documentElement 获取滚动距离作为页面和视窗间的距离
// IE 中, 当页面指定 DOCTYPE, compatMode 的值是 CSS1Compat, 否则 compatMode 的值是 BackCompat
else if(typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
point.x = document.documentElement.scrollLeft;
point.y = document.documentElement.scrollTop;
}
// 如果浏览器支持 document.body, 可以通过 document.body 来获取滚动高度
else if(typeof document.body != 'undefined') {
point.x = document.body.scrollLeft;
point.y = document.body.scrollTop;
}
// 加上鼠标在视窗中的位置
point.x += ev.clientX;
point.y += ev.clientY;
// 返回鼠标在视窗中的位置
return point;
};
var is_inRect = function (m_point,rect)
{
if ( ( rect.x <= m_point.x )
&& ( m_point.x <= rect.x + rect.width )
&& ( rect.y <= m_point.y )
&& ( m_point.y <= rect.y + rect.height )
)
return 1;
else
return 0;
};
init();
}
table_drag.css 代码如下:
写道
* {
margin:0;
padding:0;
}
#sidebar {
width: 20%;
}
#sidebar .other{
float:right;
width: 20%;
}
table.control{
border: 2px,solid,black;
border-collapse:collapse;
}
table.module{
border-style: solid;
border-width: 2px;
}
#favor_module {
background-color:blue;
}
#discnt_module {
background-color:yellow;
}
table thead{
background-color: gray;
color:white;
}
table tbody{
font-style:italic;
text-align:center;
}
table tbody tr td {
border-style: solid;
border-width: 1px;
}
table td input {
text-align:center;
}
.product {
background-color:red;
}
margin:0;
padding:0;
}
#sidebar {
width: 20%;
}
#sidebar .other{
float:right;
width: 20%;
}
table.control{
border: 2px,solid,black;
border-collapse:collapse;
}
table.module{
border-style: solid;
border-width: 2px;
}
#favor_module {
background-color:blue;
}
#discnt_module {
background-color:yellow;
}
table thead{
background-color: gray;
color:white;
}
table tbody{
font-style:italic;
text-align:center;
}
table tbody tr td {
border-style: solid;
border-width: 1px;
}
table td input {
text-align:center;
}
.product {
background-color:red;
}
代码打包见附件
相关推荐
从给定的文件信息来看,这是一段关于JavaScript实现表格拖拽功能的代码片段,主要涉及到HTML、CSS以及JavaScript的运用。下面将详细解析这段代码中的关键知识点。 ### 关键知识点解析 #### 1. HTML与DTD声明 ```...
在本主题中,我们关注的是"bootstrap-table.css 表格拖拽排序",这是一种允许用户通过鼠标拖放操作来改变表格行顺序的功能。这个特性尤其适用于那些需要频繁调整数据顺序的场景,比如任务管理或者项目进度跟踪。 ...
LabVIEW,全称为Laboratory Virtual Instrument ...以上就是实现LabVIEW中表格数据拖拽功能涉及的主要知识点。通过掌握这些技术,你不仅可以实现拖拽功能,还能进一步提升对LabVIEW数据处理和用户界面设计的理解。
bootstrap-table-reorder-columns表格拖拽排序列的一个插件 验证有效, 需放在服务器【tomcat】、【apache】、【nginx】或 【HBuilder】中调试运行即可看到真实效果
在"实现自定义表格拖拽.zip"的压缩包中,很可能包含了一个示例项目,展示了如何将拖放功能集成到Element-UI的表格中。 首先,要实现表格列的拖放,我们需要引入一个第三方库,如`vuedraggable`。`vuedraggable`是...
在本主题中,我们将深入探讨如何利用jQuery和JavaScript实现拖拽排序功能,适用于列表、菜单和表格等元素。 一、拖拽排序基础概念 拖拽排序是一种用户交互设计,允许用户通过鼠标拖动来改变元素的顺序。这种功能在...
对于拖拽功能,可能需要额外的字段,比如`dragging`标志,用于标识当前被拖动的节点。 3. **HTML5 Drag and Drop API** - `dragstart`: 当用户开始拖动元素时触发,可以设置拖动数据。 - `drag`: 拖动过程中触发...
在这个场景中,我们关注的是如何利用EasyUI实现表格数据的拖拽功能,特别是数据的横向拖拽。 首先,"easyui框架实现的表格数据拖拽功能"是指通过EasyUI的API和事件处理,使用户能够通过鼠标拖放操作来改变表格中的...
在本文中,我们将深入探讨如何使用ExtJS框架实现拖拽功能,特别是在树形视图(Tree)和表格视图(Grid)之间的交互。ExtJS是一个强大的JavaScript库,它提供了丰富的用户界面组件,包括可拖拽的元素,这使得在Web...
"实现table表格可按行拖拽,按列排序,并可以保存排序后的结果"是一个常见的需求,尤其适用于数据展示和管理的场景。这里我们将详细探讨如何利用jQuery、jQuery.tablesorter和jQuery.tablednd_0_5这三个JavaScript库...
在jQuery的$(document).ready()函数内,找到你想要应用拖拽功能的表格,然后调用colResizable的初始化方法。例如: ```javascript $(document).ready(function() { $("#myTable").colResizable({ fixed: false, /...
【标题】"DragableXpStyleTable.zip_表格拖拽" 涉及的技术点主要集中在创建一个具有XP风格,并且支持拖拽和排序功能的数据表格。这种类型的表格在网页应用中常见,能够提供用户友好的交互体验,尤其是对于数据管理和...
本文将深入探讨如何利用QT库来实现这一功能,并结合描述中的"QT实现可拖拽行排序的表格"进行详细讲解。 首先,QT是一个跨平台的应用程序开发框架,它提供了一系列丰富的图形用户界面(GUI)工具包,使得开发者能够...
" ListBox拖拽功能实现" ListBox控件是Windows Forms应用程序中的一种常见控件,它能够显示一组项目,并允许用户进行选择和拖拽操作。实现ListBox控件的拖拽功能,可以使用户更方便地在不同的ListBox控件之间移动...
EXT2.0.2中的数据拖拽功能,主要是通过DragDrop(DD)和DragDropGroup(DDG)组件来实现的。DragDrop组件允许用户将元素从一个位置拖动到另一个位置,而DragDropGroup则使得多个DragDrop对象能够相互交互,例如在...
在JavaScript(JS)中实现表格(table)列的拖拽功能是一项常见的交互设计,它可以提升用户的操作体验,尤其是在数据管理或展示场景下。这个功能主要涉及到DOM操作、事件监听以及元素位置的动态调整。以下是对这个...
在实际开发中,我们经常需要实现表格列的拖拽功能,以方便用户根据需求自定义列的顺序。这个压缩包文件提供的代码示例就是关于如何在 ElementUI 的 Table 组件中实现这一功能的。 首先,我们要理解 ElementUI 的 ...
在这个场景中,"jq 表格拖拽"是指利用jQuery实现的一种功能,允许用户通过鼠标拖动来调整表格行或列的位置,提供更加互动和个性化的用户体验。这个功能在数据展示、数据分析或者任何需要用户自定义排序的场景中非常...