javascript实现的listview效果


Posted in Javascript onApril 28, 2007

<style type="text/css">
   #oContainer {
         width: 600px;
         height: 500px;
         border: 1px solid menu;
         margin: 0px;
         padding: 0px;
         overflow: hidden;
   }
   a {
         color: black;
         text-decoration: none;
   }
   a:hover {
         color: red;
         text-decoration: underline;
   }
</style>
<script language="javascript">
   var oListView = new Object();

   function listView(_container) {
       this.author = '51JS.COM-ZMM';
       this.version = 'ListView 1.0';
       this.container = _container;
       this.box = new Object();
       this.headerWidth = 0;
       this.headerHeight = 20;
       this.itemWidth = 0;
       this.itemHeight = 0;
       this.rowsCount = 30;
       this.isResize = false;
       this.separate = new Object();
       this.startPoint = 0;
       this.endPoint = 0;
       this.tempSeparate = new Object();
       this.put_headerHeight = function(_height) { return _height; };
       this.get_headerHeight = function() { return this.headerHeight; };
       this.put_rowsCount = function(_count) { return _count; };
       this.get_rowsCount = function() { return this.rowsCount; };
   }

   listView.prototype = {
       boxInit : function() {
           this.container.innerHTML = new String();
           this.box = (function(_object) {
                var _box = document.createElement('DIV');
                with (_box) {
                      id = 'ListViewBox';
                      style.width = _object.offsetWidth;
                      style.height = _object.offsetHeight;
                      style.margin = '0px';
                      style.padding = '0px';
                      attachEvent('oncontextmenu', new Function('return false;'));
                }
                return _box;
           })(this.container);
           this.headerPanel = (function(_width, _height) {
                var _headerPanel = document.createElement('DIV');
                with (_headerPanel) {
                      style.width = _width;
                      style.height = _height;
                }           
                return _headerPanel;
           })(this.box.style.width, this.headerHeight);
           this.headerPanel.appendChild(this.textPanel = (function() {
                var  _textPanel = document.createElement('NOBR');
                _textPanel.attachEvent('onmousemove', function() {
                     with (oListView) {
                           if (event.button == 1) {
                               textPanel.style.cursor = 'E-resize';
                               tempSeparate.style.left = event.clientX - getPosition(box).left;
                               tempSeparate.style.display = 'inline';
                               endPoint = event.clientX;
                               isResize = true;
                           }
                     }
                });              
                return _textPanel;
           })());
           this.rowItemPanel = (function(_width, _height) {
                var _itemPanel = document.createElement('DIV');
                with (_itemPanel) {
                      style.width = _width;
                      style.height = _height;
                      style.overflow = 'hidden';
                }
                return _itemPanel;
           })(this.box.style.width, parseInt(this.box.style.height) - this.headerHeight);
           this.rowItemPanel.appendChild(this.dataPanel = (function() {
                var  _dataPanel = document.createElement('NOBR');
                with (_dataPanel) {
                      style.cursor = 'default';
                      attachEvent('onclick', function() {
                          document.selection.empty();
                      });
                      attachEvent('onselectstart', function() {
                          document.selection.empty();
                      });
                }
                return _dataPanel;
           })());
           this.dataPanel.appendChild(this.tempSeparate = (function(_height) {
                var _tempSeparate = document.createElement('SPAN');
                with (_tempSeparate) {
                      style.width = '1px';
                      style.height = _height;
                      style.border = '0px';
                      style.backgroundColor = 'black';
                      style.position = 'absolute';
                      style.display = 'none';                       
                }
                return _tempSeparate;
           })(this.rowItemPanel.style.height));
           this.box.appendChild(this.headerPanel);
           this.box.appendChild(this.rowItemPanel);
           this.container.appendChild(this.box);
       },

       drawListView : function(_headers, _aligns) {
           this.boxInit();
           this.drawHeader(_headers);
           this.drawRowItem(_headers, _aligns);
           document.attachEvent('onmouseup', this.finishResize);
       },

       drawHeader : function(_headers) {
           this.headers = [];
           this.headerWidth = Math.round((parseInt(this.headerPanel.style.width) - (_headers.length - 1) * 1) / _headers.length) + 1;
           for (var i = 0; i < _headers.length; i ++) {
                var _header = document.createElement('SPAN');
                with (_header) {
                      style.width = this.headerWidth;
                      style.height = this.headerHeight;
                      style.overflow = 'hidden';
                      style.backgroundColor = 'buttonface';
                      style.borderLeft = '1px solid buttonhighlight'; 
                      style.borderTop = '1px solid buttonhighlight'; 
                      style.borderRight = '1px solid buttonshadow'; 
                      style.borderBottom = '1px solid buttonshadow';
                      style.textAlign = 'center';
                      style.fontSize = '12px';
                      style.fontFamily = 'Sans-Serif, Tahoma';
                      style.paddingTop = '1px';
                      innerText = _headers[i];
                }
                this.textPanel.appendChild(_header);
                this.headers[this.headers.length] = _header;
                var _separate = this.getSeparate(true);
                this.textPanel.appendChild(_separate);
                this.headers[this.headers.length] = _separate;                                 
           }
           var _last = document.createElement('SPAN');
           with (_last) {
                 style.width = this.headerPanel.offsetWidth;
                 style.height = this.headerHeight;
                 style.overflow = 'hidden';
                 style.backgroundColor = 'buttonface';
                 style.borderLeft = '1px solid buttonhighlight'; 
                 style.borderTop = '1px solid buttonhighlight'; 
                 style.borderRight = '1px solid buttonshadow'; 
                 style.borderBottom = '1px solid buttonshadow'; 
                 style.textAlign = 'center';
                 style.fontSize = '12px';
                 style.fontFamily = 'Sans-Serif, Tahoma';
                 style.paddingTop = '1px';
                 innerText = new String();
           }
           this.textPanel.appendChild(_last); 
           this.headers[this.headers.length] = _last;       
       }, 

       drawRowItem : function(_headers, _aligns) {
           this.items = [];
           this.itemWidth = Math.round((parseInt(this.rowItemPanel.style.width) - (_headers.length - 1) * 1) / _headers.length) + 1;
           this.itemHeight = parseInt(this.rowItemPanel.style.height) - 2;
           for (var i = 0; i < _headers.length; i ++) {
                var _item = document.createElement('SPAN');
                with (_item) {
                      style.width = this.itemWidth;
                      style.height = this.itemHeight;
                      style.overflow = 'hidden';
                      style.padding = '0px';
                      appendChild((function(_count, _width, _height, _align) {
                            var _table = document.createElement('TABLE');
                            with (_table) {
                                  cellSpacing = 0;
                                  cellPadding = 0;
                                  style.width = _width;
                                  style.tableLayout = 'fixed';
                            }
                            var _tbody = document.createElement('TBODY');
                            for (var i = 0; i < _count; i ++) {
                                 var _tableTr = document.createElement('TR');
                                 var _tableTd = document.createElement('TD');
                                 with (_tableTd) {
                                       align = _align;
                                       style.height = _height;                            
                                       style.borderBottom = '1px solid #c6c3c6';
                                       style.fontSize = '12px';
                                       style.paddingLeft = '3px';
                                       setAttribute('onclick', function() {
                                           oListView.selectedRow(this.parentNode.rowIndex);  
                                       });
                                       setAttribute('ondblclick', function() {
                                           oListView.showSelected(this.parentNode.rowIndex);  
                                       });
                                       innerHTML = new String(' ');
                                 }
                                 _tableTr.appendChild(_tableTd);
                                 _tbody.appendChild(_tableTr);
                            }
                            _table.appendChild(_tbody);
                            return _table;
                      })(this.rowsCount, this.itemWidth, Math.round(this.itemHeight / this.rowsCount), _aligns[i]));
                }
                this.dataPanel.appendChild(_item);
                this.items[this.items.length] = _item; 
                var _separate = this.getSeparate(false);
                _separate.style.height = this.itemHeight;
                this.dataPanel.appendChild(_separate);
                this.items[this.items.length] = _separate;                   
           }
           var _last = document.createElement('SPAN');
           with (_last) {
                 style.width = this.rowItemPanel.offsetWidth;
                 style.height = this.itemHeight;
                 style.overflow = 'hidden';
                 style.padding = '0px';
                 appendChild((function(_count, _width, _height) {
                       var _table = document.createElement('TABLE');
                       with (_table) {
                             cellSpacing = 0;
                             cellPadding = 0;
                             style.width = '100%';
                       }
                       var _tbody = document.createElement('TBODY');
                       for (var i = 0; i < _count; i ++) {
                            var _tableTr = document.createElement('TR');
                            var _tableTd = document.createElement('TD');
                            with (_tableTd) {
                                  style.height = _height;                            
                                  style.borderBottom = '1px solid menu';
                                  innerHTML = new String('<nobr style="height: ' + eval(_height-1) + ';overflow: hidden;"> </nobr>');
                            }
                            _tableTr.appendChild(_tableTd);
                            _tbody.appendChild(_tableTr);
                       }
                       _table.appendChild(_tbody);
                       return _table;
                 })(this.rowsCount, this.itemWidth, Math.round(this.itemHeight / this.rowsCount)));
           }
           this.dataPanel.appendChild(_last); 
           this.items[this.items.length] = _last; 
       },        

       getSeparate : function(_resize) {
           var _separate = document.createElement('SPAN');
           with (_separate) {
                 style.width = _resize ? '2px' : '1px' ;
                 style.height = this.headerHeight;
                 style.border = '1px ' + (_resize ? 'inset white' : 'solid #c6c3c6');
                 style.overflow = 'hidden';
                 style.position = 'absolute';
                 if (_resize) {
                     attachEvent('onmousedown', function() {
                         with (oListView) {
                               separate = event.srcElement;
                               startPoint = event.clientX;
                         }
                     });
                     attachEvent('onmouseenter', function() {
                         event.srcElement.style.cursor = 'E-resize';
                     });
                 }
           }
           return _separate;           
       },

       getPosition : function(_object) {
           var _top = _left = 0;
           var _root = document.body;
           while (_object != _root) {
                  _left += _object.offsetLeft;
                  _object = _object.offsetParent;
           }
           return { left: _left };              
       }, 

       resizeItem : function() {
           with (this) {
                 var _width, _movePart = endPoint - startPoint;
                 for (var i = 0; i < headers.length; i ++) {
                      if (headers[i] == separate) {
                          var _bool = true;
                          _bool = _bool && (_movePart < 0);
                          _bool = _bool && (parseInt(headers[i - 1].style.width) < Math.abs(_movePart));
                          if (_bool) {
                              headers[i - 1].style.width = 0;
                              items[i - 1].style.width = 0;
                          } else {
                              _width = parseInt(headers[i - 1].style.width);
                              headers[i - 1].style.width = _width + _movePart;
                              _width = parseInt(items[i - 1].style.width);
                              items[i - 1].style.width = _width + _movePart;
                              _width = parseInt(items[i - 1].firstChild.style.width);
                              items[i - 1].firstChild.style.width = _width + _movePart;
                              var _table = items[i - 1].firstChild;
                              for (var j = 0; j < _table.rows.length; j ++) {
                                   var _dataPanel = _table.rows[j].cells[0].children[0];                                 
                                   if (typeof _dataPanel != 'undefined') {
                                       _width = parseInt(_dataPanel.style.width); 
                                       _dataPanel.style.width = _width + _movePart;
                                   }
                              }
                          }
                      }
                 }
           } 
       },

       finishResize : function() {
           with (oListView) {
                 if (isResize) {
                     isResize = false;
                     textPanel.style.cursor = 'default';
                     tempSeparate.style.display = 'none';
                     resizeItem();
                 }
           }            
       },

       addListItem : function(_datas) {
           var _itemNum = _datas.length > this.rowsCount ? this.rowsCount : _datas.length ;
           for (var i = 0; i < _itemNum; i ++) {
                var n = 0;
                for (j = 0; j < this.items.length - 2; j ++) {
                     if (j % 2 == 0) {
                         var _dataPanel = document.createElement('NOBR');
                         var _tableCell = this.items[j].firstChild.rows[i].cells[0];
                         with (_dataPanel) {
                               style.width = this.itemWidth;
                               style.overflow = 'hidden';
                               style.textOverflow = 'ellipsis';
                               innerHTML = _datas[i][n];
                         }
                         _tableCell.innerHTML = new String();
                         _tableCell.appendChild(_dataPanel);
                         _tableCell.title = _datas[i][0];
                         n ++;
                     }
                }
           }
       },

       selectedRow : function(n) {
           for (var i = 0; i < this.items.length; i++) {
                if (i % 2 == 0) {
                    var _table = this.items[i].firstChild;
                    for (var j = 0; j < _table.rows.length; j ++) {
                         var _dataPanel = _table.rows[j].cells[0].children[0];                                 
                         if (typeof _dataPanel != 'undefined') {
                             if (j == n) {
                                 _table.rows[j].cells[0].style.color = 'highlighttext';
                                 _table.rows[j].cells[0].style.backgroundColor = 'highlight';
                             } else {
                                 _table.rows[j].cells[0].style.color = '';
                                 _table.rows[j].cells[0].style.backgroundColor = '';
                             }
                             var _children = _table.rows[j].cells[0].firstChild.children;
                             this.changeChild(_children, j == n);
                         }
                    }                
                }
           }
       },

       changeChild : function(_children, _isSelected) {
           if (typeof _children != 'undefined') {
               for (var i = 0; i < _children.length; i ++) {
                    if (_isSelected) {
                        _children[i].style.color = 'highlighttext';
                        _children[i].style.backgroundColor = 'highlight';
                    } else {
                        _children[i].style.color = '';
                        _children[i].style.backgroundColor = '';                         
                    }
               }                
           } else {
               return false;
           }
       },

       showSelected : function(n) {
           var _text = new String();
           for (var i = 0; i < this.items.length - 2; i++) {
                if (i % 2 == 0) {
                    var _table = this.items[i].firstChild;
                    _text += this.headers[i].innerText + ':\n';
                    _text += _table.rows[n].cells[0].firstChild.innerHTML + '\n\n';            
                }
           }
           alert(_text);            
       }      
   }

   function initListView() {
       var _headers = [];
       _headers[_headers.length] = '标题';
       _headers[_headers.length] = '内容';
       _headers[_headers.length] = '时间';    
       _headers[_headers.length] = '管理';
       var _aligns = [];
       _aligns[_aligns.length] = 'left';
       _aligns[_aligns.length] = 'left';
       _aligns[_aligns.length] = 'center';    
       _aligns[_aligns.length] = 'center';         
       oListView = new listView(self.oContainer);
       oListView.drawListView(_headers, _aligns);

       var _items = [];
       _items[_items.length] = ['标题一', '内容一', '2006-6-21 10:30:00', '<a href="update.aspx">编辑</a>  <a href="delete.aspx">删除</a>'];
       _items[_items.length] = ['标题二', '内容二', '2006-6-21 14:20:12', '<a href="update.aspx">编辑</a>  <a href="delete.aspx">删除</a>'];
       _items[_items.length] = ['标题三', '内容三', '2006-6-21 20:45:36', '<a href="update.aspx">编辑</a>  <a href="delete.aspx">删除</a>'];
       oListView.addListItem(_items);                                    
   }

   attachEvent('onload', initListView);
</script>
<center>
   <div id="oContainer"></div>
</center>

Javascript 相关文章推荐
一段批量给页面上的控件赋值js
Jun 19 Javascript
让AJAX不依赖后端接口实现方案
Dec 03 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
JSON取值前判断
Dec 23 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
angularJS深拷贝详解
Mar 23 Javascript
在js中做数字字符串补0(js补零)
Mar 25 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
浅谈JS的二进制家族
May 09 Javascript
Javascript模板技术
Apr 27 #Javascript
javascript函数库-集合框架
Apr 27 #Javascript
仿服务器端脚本方式的JS模板实现方法
Apr 27 #Javascript
改版了网上的一个js操作userdata
Apr 27 #Javascript
用 JSON 处理缓存
Apr 27 #Javascript
转一个日期输入控件,支持FF
Apr 27 #Javascript
学习jquery之一
Apr 27 #Javascript
You might like
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
js的2种继承方式详解
2014/03/04 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
python多线程threading.Lock锁用法实例
2014/11/01 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
化工专业应届生求职信
2013/11/08 职场文书
零件设计自荐信范文
2013/11/27 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技