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 相关文章推荐
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
深入分析Javascript跨域问题
Apr 17 Javascript
javascript中数组方法汇总
Jul 07 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
jquery淡入淡出效果简单实例
Jan 14 Javascript
AngularJS转换响应内容
Jan 27 Javascript
javascript实现简单的on事件绑定
Aug 23 Javascript
jQuery ajax的功能实现方法详解
Jan 06 Javascript
Bootstrap Table使用整理(三)
Jun 09 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
JS如何实现手机端输入验证码效果
May 13 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 18 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
smarty的保留变量问题
2008/10/23 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
详解flask入门模板引擎
2018/07/18 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
公务员诚信承诺书
2014/05/26 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书