- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章javascript实现表格排序 编辑 拖拽 缩放由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
简单表格排序 。
可以双击编辑 自定义编辑后的 规则 。
可拖动列进行列替换 。
可推动边框进行列宽度的缩放 。
。
。
window.Sys.ie6&&document.execCommand("BackgroundImageCache", false, true),
window.$ = function(Id){ return document.getElementById(Id); }; window.addListener = function(element,e,fn){ !element.events&&(element.events = {}); element.events[e]&&(element.events[e][addListener.guid++]=fn)||(element.events[e] = {'0':fn}); element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" + e,fn); }; window.addListener.guid = 1; window.removeListener = function(element,e,fn){ var handlers = element.events[e],type; if(fn){ for(type in handlers) if(handlers[type]===fn){ element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" + e,fn); delete handlers[type]; } }else{ for(type in handlers){ element.removeEventListener?element.removeEventListener(e,handlers[type],false):element.detachEvent("on" + e,handlers[type]); delete handlers[type]; } } }; window.setStyle = function(e,o){ if(typeof o=="string") e.style.cssText=o; else for(var i in o) e.style[i] = o[i]; },
var slice = Array.prototype.slice; window.Bind = function(object, fun) { var args = slice.call(arguments).slice(2); return function() { return fun.apply(object, args); }; }; window.BindAsEventListener = function(object, fun,args) { var args = slice.call(arguments).slice(2); return function(event) { return fun.apply(object, [event || window.event].concat(args)); } }; //copy from jQ window.Extend = function(){ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = true, options; if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; i = 2; } if ( typeof target !== "object" && Object.prototype.toString.call(target)!="[object Function]") target = {}; for(;i<length;i++){ if ( (options = arguments[ i ]) != null ) for(var name in options){ var src = target[ name ], copy = options[ name ]; if ( target === copy ) continue; if ( deep && copy && typeof copy === "object" && !copy.nodeType ){ target[ name ] = arguments.callee( deep, src || ( copy.length != null ? [ ] : { } ), copy ); } else if(copy !== undefined) target[ name ] = copy; } } return target; }; window.objPos = function(o){ var x = 0, y = 0; do{x += o.offsetLeft;y += o.offsetTop;}while((o=o.offsetParent)); return {'x':x,'y':y}; } window.Class = function(properties){ var _class = function(){return (arguments[0] !== null && this.initialize && typeof(this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;}; _class.prototype = properties; return _class; }; window.hasClass = function(element, className){ return element.className.match(new RegExp('(\\s|^)'+className+'(\\s|$)')); } ; window.addClass = function(element, className) { !this.hasClass(element, className)&&(element.className += " "+className); } window.removeClass = function(element, className) { hasClass(element, className)&&(element.className = element.className.replace(new RegExp('(\\s|^)'+className+'(\\s|$)'),' ')); } })(window),
var Table = new Class({ options :{ minWidth : 62 }, initialize : function(tab,set){ this.table = tab; this.rows = []; //里面记录所有tr的引用 this.sortCol = null; //记录哪列正在排序中 this.inputtd = null; //记录哪个td正在被编辑了 this.editconfig = {}; //编辑表格的规则和提示 this.thead = tab.getElementsByTagName('thead')[0]; this.theadTds = tab.getElementsByTagName('thead')[0].getElementsByTagName('td'); //常常用到的dom集合可以用个属性来引用 this.tbodyTds = tab.getElementsByTagName('tbody')[0].getElementsByTagName('td'); this.closConfig = { on : false, td : null, totd : null }; this.widthConfig = { td : null, nexttd : null, x : 0, tdwidth : 0, nexttdwidth : 0 }; Extend(this,this.options); //不知道原因 反正不设置就会乱跳 (Sys.ie6||Sys.chrome)&&(tab.width=tab.offsetWidth) //记录那些checkbox,radio被选中了 ie6在做dom操作的时候不会记住这些状态 if(Sys.ie6){ this.checkbox = {}; var checkboxs = tab.getElementsByTagName('input'),i=0,l=checkboxs.length; for(;i<l;i++) (checkboxs[i].type=="checkbox"||checkboxs[i].type=="radio")&& addListener(checkboxs[i],"click",Bind(this,function(elm,i){ elm.checked==true?(this.checkbox[i] = elm):(delete this.checkbox[i]); },checkboxs[i],i)); }; var i=0,l=set.length,rows =tab.tBodies[0].rows,d=document,tabTads=tab.getElementsByTagName('td'),length=this.theadTds.length; //编辑用的input this.input = d.createElement('input'); this.input.type = "text"; this.input.className = 'edit'; //用于显示正在拖拽的div this.div = d.body.appendChild(d.createElement('div')); this.div.className ="div"; //进行缩放的时候显示的竖线 this.line = d.body.appendChild(d.createElement('div')); this.line.className = 'line'; this.line.style.top = objPos(tab).y +"px"; //遍历set 做一些设置 for(;i<l;i++){ //给需要排序的猎头绑定事件 addListener(this.theadTds[set[i].id],'click',Bind(this,this.sortTable,this.theadTds[set[i].id],set[i].type)); //给需要编辑的表给列定义所需配置 set[i].edit&&(this.editconfig[set[i].id]={rule:set[i].edit.rule,message:set[i].edit.message}); } //把 所有的tr放到一个数组 用于排序 for( i=0,l=rows.length;i<l;i++) this.rows[i]=rows[i]; //遍历所有的td 做一些设置 for( i=0,l=tabTads.length;i<l;i++){ //将头部的td全部做上标记 拖拽的时候要用到 i<length&&tabTads[i].setAttribute('clos',i); //将需要编辑的td添加edit属性 i>=length&&this.editconfig[i%length]&&tabTads[i].setAttribute('edit',i%length); } //绑定 拖拽 和缩放的操作 addListener(this.thead,'mousedown',BindAsEventListener(this,this.dragOrWidth)); //拖拽的时候 记录移动到了那列td上 addListener(this.thead,'mouseover',BindAsEventListener(this,this.theadHover)); //唉 addListener(this.thead,'mouseout',BindAsEventListener(this,this.theadOut)); //绑定编辑事件 根据e.srcElement or e.target去判断是哪个表格被编辑 addListener(tab,'dblclick',BindAsEventListener(this,this.edit)); //当离开input时候保存下修改的内容 addListener(this.input,'blur',Bind(this,this.save,this.input)); }, sortTable :function(td,type){ //td为点击的那个元素 n 为哪一列进行排序 type为进行什么类型的排序 var frag=document.createDocumentFragment(),span=td.getElementsByTagName('span')[0],str= span.innerHTML; if(td===this.sortCol){ this.rows.reverse(); span.innerHTML =str.replace(/.$/,str.charAt(str.length-1)=="↓"?"↑":"↓") ; }else{ this.rows.sort(this.compare(td.getAttribute('clos'),type)); span.innerHTML = span.innerHTML + "↑"; this.sortCol!=null&&(this.sortCol.getElementsByTagName('span')[0].innerHTML = this.sortCol.getElementsByTagName('span')[0].innerHTML.replace(/.$/,''));//把之前那列排序的标识去掉 }; for(var i=0,l=this.rows.length;i<l;i++) frag.appendChild(this.rows[i]); this.table.tBodies[0].appendChild(frag); if(Sys.ie6){ for(var s in this.checkbox) this.checkbox[s].checked = true; } this.sortCol = td; //记录哪一列正在排序中 }, compare :function(n,type){ return function (a1,a2){ var convert ={ int : function(v){return parseInt(v)}, float : function(v){return parseFloat(v)}, date : function(v){return v.toString()}, string : function(v){return v.toString()} }; !convert[type]&&(convert[type]=function(v){return v.toString()}); a1 =convert[type](a1.cells[n].innerHTML); a2 =convert[type](a2.cells[n].innerHTML); return a1==a2?0:a1<a2?-1:1; }; }, edit: function(e){ var elem = this.inputtd=e.srcElement || e.target; if(!elem.getAttribute('edit'))return; this.input.value = elem.innerHTML; elem.innerHTML = ""; elem.appendChild(this.input); this.input.focus(); }, save : function(elem){ var editinfo=this.editconfig[elem.parentNode.getAttribute('edit')],status={ "[object Function]" : 'length' in editinfo.rule&&editinfo.rule(this.input.value)||false, "[object RegExp]" : 'test' in editinfo.rule&&editinfo.rule.test(this.input.value)||false }[Object.prototype.toString.call(editinfo.rule)],_self=this; //如果不符合条件 修改提示信息 typeof status != "boolean"&&(editinfo.message = status); if(status===true){ this.inputtd.innerHTML = this.input.value; this.inputtd=null; }else{ alert(editinfo.message); //firefox下 直接用input.focus()不会执行 用setTimeout可以执行 setTimeout(function(){_self.input.focus()},0); } }, theadHover : function(e){ var elem = e.srcElement || e.target; if(elem.nodeName.toLowerCase() ==='td'&&this.closConfig.on){ this.closConfig.totd = elem.getAttribute('clos'); !hasClass(elem,'thover')&&addClass(elem,'thover'); } }, theadOut : function(e){ var elem = e.srcElement || e.target; if(elem.nodeName.toLowerCase() ==='td'&&this.closConfig.on)removeClass(elem,'thover') }, dragOrWidth : function(e){ var elem = e.srcElement || e.target,widthConfig=this.widthConfig; //执行拖拽 if(elem.nodeName.toLowerCase()==='td'){ this.closConfig.td = elem.getAttribute('clos'); addListener(document,'mousemove',BindAsEventListener(this,this.dragMove)); addListener(document,'mouseup',Bind(this,this.dragUp)); this.closConfig.on = true; Sys.ie?this.thead.setCapture(false):e.preventDefault(); } //执行宽度缩放 if(elem.nodeName.toLowerCase()==='div'){ Sys.ie?(e.cancelBubble=true):e.stopPropagation(); //如果是最后一个td里面的div 不进行缩放 if(this.theadTds[this.theadTds.length-1]===elem.parentNode)return Sys.ie?this.thead.setCapture(false):e.preventDefault(); widthConfig.x = e.clientX; widthConfig.td = elem.parentNode; widthConfig.nexttd = widthConfig.td.nextSibling; while(widthConfig.nexttd.nodeName.toLowerCase()!="td"){ widthConfig.nexttd = widthConfig.nexttd.nextSibling; }; widthConfig.tdwidth = widthConfig.td.offsetWidth; widthConfig.nexttdwidth = widthConfig.nexttd.offsetWidth; this.line.style.height = this.table.offsetHeight +"px"; addListener(document,'mousemove',BindAsEventListener(this,this.widthMove)); addListener(document,'mouseup',Bind(this,this.widthUp)); } }, dragMove : function(e){ window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); setStyle(this.div,{display:"block",left:e.clientX+9+"px",top:e.clientY+20+"px"}); }, dragUp :function(){ var closConfig = this.closConfig,rows = this.table.getElementsByTagName('tr'),td,n,o,i=0,l=rows.length; this.div.style.display = "none"; removeListener(document,'mousemove'); removeListener(document,'mouseup'); Sys.ie&&this.thead.releaseCapture(); closConfig.on = false; if(closConfig.totd===null)return; removeClass(this.theadTds[closConfig.totd],'thover'); //在同一列 不进行列替换 if(closConfig.td === closConfig.totd)return; //进行列替换 如果 if(closConfig.td*1+1===closConfig.totd*1){ n = closConfig.totd; o = closConfig.td; }else{ n = closConfig.td; o = closConfig.totd; } for(;i<l;i++){ td = rows[i].getElementsByTagName('td'); rows[i].insertBefore(td[n],td[o]); } //重新标识表头 for(i=0,l=this.theadTds.length;i<l;i++) this.theadTds[i].setAttribute('clos',i); closConfig.totd=closConfig.td=null; }, widthMove : function(e){ window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); var widthConfig = this.widthConfig,x = e.clientX - widthConfig.x,left = e.clientX,clientX=left; if(clientX<widthConfig.x&&widthConfig.x - clientX>widthConfig.tdwidth-this.minWidth){ left = widthConfig.x - widthConfig.tdwidth+this.minWidth; } if(clientX>widthConfig.x&&clientX - widthConfig.x>widthConfig.nexttdwidth-this.minWidth){ left =widthConfig.x + widthConfig.nexttdwidth-this.minWidth; } setStyle(this.line,{display:"block",left:left+"px"}); }, widthUp : function(){ this.line.style.display = "none"; var widthConfig = this.widthConfig,x= parseInt(this.line.style.left) - widthConfig.x; widthConfig.nexttd.style.width = widthConfig.nexttdwidth -x -1 +'px'; widthConfig.td.style.width = widthConfig.tdwidth + x -1 +'px'; Sys.ie&&this.thead.releaseCapture(); removeListener(document,'mousemove'); removeListener(document,'mouseup'); } }); window.onload = function(){ function checkName(val){ if(val.replace(/^\s+$/g,'')==='') return '姓名输入不能为空'; if(val.replace(/^\s+|\s+$/,'').length>10) return '姓名长度不能大于10个字符'; if(!/^[\u4e00-\u9fa5a-z]+$/i.test(val)) return '姓名只能输入中文或者是字母'; return true; }; function checkRemark(val){ if(val.replace(/^\s+$/g,'')==='') return '备注输入不能为空'; if(val.replace(/^\s+|\s+$/,'').length>15) return '备注长度不能大于15个字符'; if(!/^[\u4e00-\u9fa5\w\s]+$/i.test(val)) return '备注只能输入中文数字下划线空格'; return true; } var set = [ {id:0,type:"int"}, {id:2,type:"string",edit:{rule:checkName,message:''}}, {id:3,type:"date",edit:{rule:/^\d{4}\-\d{2}\-\d{2}$/,message:"按这中格式输入日期 1985-02-30"}}, {id:4,type:"string",edit:{rule:checkRemark,message:''}} ]; new Table($("tab"),set); } </script> </body> </html> 。
。
已知BUG:
ie6下 中文不自动换行 。
非ie下字母和数字也不自动换行确实让人恼火 。
chrome浏览器下点击运行好像问题很大 拿到本地测试会比较好 。
最后此篇关于javascript实现表格排序 编辑 拖拽 缩放的文章就讲到这里了,如果你想了解更多关于javascript实现表格排序 编辑 拖拽 缩放的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!