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 相关文章推荐
捕获键盘事件(且兼容各浏览器)
Jul 03 Javascript
在Node.js中实现文件复制的方法和实例
Jun 05 Javascript
JavaScript中的数学运算介绍
Dec 29 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
angular双向绑定模拟探索
Dec 26 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
Vuex之理解Mutations的用法实例
Apr 19 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
用Vue编写抽象组件的方法
May 06 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 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
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
浅谈react前后端同构渲染
2017/09/20 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
python__name__原理及用法详解
2019/11/02 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
P/Invoke是什么
2015/07/31 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
对教师的评语
2014/04/28 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
英文导游词
2015/02/13 职场文书
论文答辩开场白大全
2015/05/27 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL