看了博友auntion的【擅用事件代理,警惕闭包的性能陷阱】真是一语惊醒梦中人的感觉...

本文主要是介绍看了博友auntion的【擅用事件代理,警惕闭包的性能陷阱】真是一语惊醒梦中人的感觉...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前写过一个日历控件,现在回头看了一下代码,简直就是一坨屎

今天抽个时间,用事件代理模式重写了一下

ExpandedBlockStart.gif 代码
  1  Date.prototype.Add  =   function  () {
  2       if  (arguments[ 0 !==  undefined)
  3           this .setTime( this .getTime()  +  ( 60   *   60   *   24   *   1000   *  parseInt(arguments[ 0 ])));
  4       return   this ;
  5  };
  6  Date.prototype.format  =   function  () {
  7       var  y  =   this .getFullYear();
  8       var  m  =   this .getMonth()  +   1 ;
  9       var  d  =   this .getDate();
 10       if  (arguments[ 0 !==  undefined)
 11           return  arguments[ 0 ].replace( " MM " , m).replace( " dd " , d).replace( " yyyy " , y);
 12       return  m  +   " / "   +  d  +   " / "   +  y;
 13  };
 14  Date.prototype.convert  =   function  () {
 15       if  (arguments[ 0 !==  undefined  &&  arguments[ 0 !==   "" )
 16           return   new  Date(arguments[ 0 ]);
 17       return   this ;
 18  };
 19  var  Calendar  =  ( function  () {
 20       var  that  =   this ;
 21       var  zIndex  =   1000 ;
 22       var  monthRow  =   0 ;
 23       var  Week  =  [ " <font color='red'>Sun</font> " " Mon " " Tue " " Wed " " Thur " " Fri " " <font color='red'>Sat</font> " ];
 24       var  Month  =  [ " January " " February " " March " " April " " May " " June " " July " " August " " September " " October " " November " " December " ];
 25       var  MonthDay  =  [ 31 28 31 30 31 30 31 31 30 31 30 31 ];
 26       var  tdStyle  =   " font-size: 12px;height: 18px;font-family: verdana, arial, helvetica; " ;
 27       var  thStyle  =   " font-size: 11px;height: 20px;font-family: verdana, arial, helvetica;background-color:#ebf4fc;width:30px " ;
 28       var  selStyle  =   " color:black; background:white; font-family:verdana, arial, helvetica; font-size:11px;  BORDER-BOTTOM:#DDE3E6 solid 1px; BORDER-LEFT:#ADC3C6 solid 1px; BORDER-RIGHT:#DDE3E6 solid 1px; BORDER-TOP:#ADC3C6 solid 1px; " ;
 29       var  ImgArr  =  { closeBtn:  " images/button_close.gif " , navLeft:  " images/navLeft.gif " , Left:  " images/left.gif " , navRight:  " images/navRight.gif " , Right:  " images/right.gif " , yclose:  " images/yclose.gif "  };
 30       var  getPosXY  =   function  (e) {
 31           if  (e) {
 32               var  rect  =  e.getBoundingClientRect();
 33               var  top  =  rect.top  +  document.documentElement.scrollTop  -  document.documentElement.clientTop  +  e.offsetHeight;
 34               var  left  =  rect.left  +  document.documentElement.scrollLeft  -  document.documentElement.clientLeft;
 35               if  (document.all) {
 36                  top  -=   2 ;
 37                  left  -=   2 ;
 38              }
 39               return  { top: top, left: left };
 40          }
 41           else
 42               return  { top:  0 , left:  0  };
 43      };
 44       var  currentDate  =   new  Date();
 45       var  currentInput  =   null ;
 46       var  currentCallback  =   null ;
 47       var  bodyCalendar  =   function  () {
 48           var  html  =   "" ;
 49          html  +=   ' <div id="__viewdiv" style="position: absolute; display: none; width: 210px; height: 150px;cursor:pointer;z-index:  '   +  (zIndex ++ +   ' ;background-color:white;border:1px solid #6D84B4"> ' ;
 50          html  +=   ' <div style="background-color:#6D84B4;padding:0px 3px;height:25px;line-height:25px;"> ' ;
 51          html  +=   ' <div style="width:88%;float:left;text-align:left;padding:3px 0px;"><table cellspacing="0" cellpadding="0" style="width:100%" align="center"> ' ;
 52          html  +=   ' <tr><td><img src=" '   +  ImgArr.navLeft  +   ' " name="navLeft"></td><td><img src=" '   +  ImgArr.Left  +   ' " name="left"></td> ' ;
 53          html  +=   ' <td> ' ;
 54          html  +=   ' <span style=" '   +  tdStyle  +   ' ;width:70px;" id="__monthSpan"> '   +  Month[(currentDate.getMonth())]  +   ' </span> ' ;
 55          html  +=   ' </td><td> ' ;
 56          html  +=   ' <span style=" '   +  tdStyle  +   ' " id="__yearSpan"> '   +  currentDate.getFullYear()  +   ' </span> ' ;
 57          html  +=   ' </td><td><img src=" '   +  ImgArr.Right  +   ' " name="right"></td><td><img src=" '   +  ImgArr.navRight  +   ' " name="navRight"></td> ' ;
 58          html  +=   ' </tr></table></div> ' ;
 59          html  +=   ' <div style="width:12%;float:right;text-align:right;padding:3px 0px;"><img name="btnClose" src=" '   +  ImgArr.closeBtn  +   ' "></div> ' ;
 60          html  +=   ' </div> ' ;
 61          html  +=   ' <div id="__calendar" style="cursor:pointer"> ' ;
 62          html  +=  infoCalendar();
 63          html  +=   ' </div> ' ;
 64          html  +=   ' <div style="background-color:#ebf4fc;height:18px;line-height:18px;text-align:right;font-family:verdana, arial, helvetica; font-size:11px;">Today:  '   +   new  Date().format()  +   ' &nbsp;</div> ' ;
 65          html  +=   ' </div> ' ;
 66           return  html;
 67      };
 68       var  infoCalendar  =   function  () {
 69           var  dateStr  =  currentDate;
 70           var  y  =  parseInt(dateStr.getFullYear());
 71           var  m  =  parseInt(dateStr.getMonth());
 72           var  d  =  parseInt(dateStr.getDate());
 73          dateStr  =   new  Date((m  +   1 +   " /1/ "   +  y);
 74           var  dayofweek  =  parseInt(dateStr.getDay());
 75           function  buildTH(vle, style) {
 76               return   ' <th style=" '   +  style  +   ' "> '   +  vle  +   ' </th> ' ;
 77          }
 78           var  html  =   "" ;
 79          html  +=   ' <table style="border-collapse: collapse;border: 1px solid #ccffff" cellspacing="0" cellpadding="0" width="100%" align="center" border="1"> ' ;
 80          html  +=   ' <tr> ' ;
 81           for  ( var  i  =   0 , len  =  Week.length; i  <  len; i ++ )
 82              html  +=  buildTH(Week[i], thStyle);
 83          html  +=   ' </tr> ' ;
 84           if  (m  ==   1 ) {
 85               if  (parseInt(y)  %   4   ==   0 )
 86                  MonthDay[m]  =   29 ;
 87               else
 88                  MonthDay[m]  =   28 ;
 89          }
 90           var  nowprintday  =   0 ;
 91           var  truedayMonth  =  MonthDay[m];
 92           var  html_week  =   '' ;
 93           for  ( var  j  =   0 ; j  <   6 ; j ++ ) {
 94              monthRow  =  j;
 95              dayofweek  =  parseInt(dateStr.getDay());
 96              html_week  +=   ' <tr align="center"> ' ;
 97               for  ( var  w  =   0 ; w  <  dayofweek; w ++ ) {
 98                   if  (m  ==   0 )
 99                      m  =   12 ;
100                   var  x  =  parseInt(parseInt(MonthDay[m  -   1 ])  -  dayofweek  +  (w  +   1 ));
101                  html_week  +=   ' <td style=" '   +  tdStyle  +   ' width:30px;"><font color="#d3d3d3"> '   +  x  +   ' </font></td> ' ;
102              }
103               for  ( var  tw  =  dayofweek; tw  <   7 ; tw ++ ) {
104                  nowprintday ++ ;
105                   if  (nowprintday  ==  d) {
106                      html_week  +=   ' <td name="daytd"  vle=" '   +  ((dateStr.getMonth()  +   1 +   " / "   +  nowprintday  +   " / "   +  y)  +   ' " style=" '   +  tdStyle  +   ' background-color:#696969;width:30px;"> '   +  nowprintday  +   ' </td> ' ;
107                  }
108                   else  {
109                      html_week  +=   ' <td name="daytd" vle=" '   +  ((dateStr.getMonth()  +   1 +   " / "   +  nowprintday  +   " / "   +  y)  +   ' " style=" '   +  tdStyle  +   ' width:30px;"> '   +  nowprintday  +   ' </td> ' ;
110                  }
111                  dateStr  =  dateStr.Add( 1 );
112                   if  (nowprintday  >=  truedayMonth)
113                       break ;
114              }
115               for  ( var  i  =   1 ; i  <=  ( 7   -  (tw  +   1 )); i ++ ) {
116                  html_week  +=   ' <td style=" '   +  tdStyle  +   ' width:30px;"><font color="#d3d3d3"> '   +  i  +   ' </font></td> ' ;
117              }
118              html_week  +=   ' </tr> ' ;
119               if  (nowprintday  >=  truedayMonth)
120                   break ;
121          }
122          html  +=  html_week;
123          html  +=   ' </table> ' ;
124           return  html;
125      };
126       var  GetIndex  =   function  (arr, key) {
127           for  ( var  i  =   0 ; i  <  arr.length; i ++ ) {
128               if  (arr[i]  ==  key)
129                   return  i  +   1 ;
130          }
131           return   - 1 ;
132      }
133       var  SetHeight  =   function  () {
134           if  ( ! document.all) {
135               if  (monthRow  >   4 )
136                  document.getElementById( " __viewdiv " ).style.height  =   173   +   " px " ;
137               else
138                  document.getElementById( " __viewdiv " ).style.height  =   154   +   " px " ;
139          }
140      };
141       var  setCalendarDiv  =   function  (dateStr, calendardiv) {
142          currentDate  =   new  Date().convert(dateStr);
143          calendardiv.innerHTML  =  bodyCalendar();
144      };
145       var  showYearMonth  =   function  (ID, div, target, current) {
146           var  yearDiv  =  document.getElementById(ID);
147           if  ( ! yearDiv) {
148              yearDiv  =  document.createElement( " div " );
149              yearDiv.id  =  ID;
150              div.appendChild(yearDiv);
151              yearDiv.innerHTML  =  createYearMonth(ID, current);
152          }
153           else
154              yearDiv.innerHTML  =  createYearMonth(ID, current);
155           var  o  =  getPosXY(target);
156          yearDiv.style.zIndex  =  zIndex ++ ;
157          yearDiv.style.position  =   " absolute " ;
158          yearDiv.style.display  =   "" ;
159          yearDiv.style.width  =  (ID.indexOf( " month " >=   0   ?   " 80px "  :  " 360px " );
160          yearDiv.style.top  =  o.top;
161          yearDiv.style.left  =  o.left;
162      }
163       var  createYearMonth  =   function  (ID, current) {
164           var  row, col;
165           if  (ID.indexOf( " month " >=   0 )
166              row  =   12 , col  =   1 , mid  =  GetIndex(Month, document.getElementById( " __monthSpan " ).innerHTML);
167           if  (ID.indexOf( " year " >=   0 )
168              row  =   8 , col  =   9 , mid  =  parseInt(document.getElementById( " __yearSpan " ).innerHTML);
169           var  html  =   '' , w  =  (col  ==   1   ?   100  :  90 /  col;
170           var  start  =  col  ==   1   ?   1  : current  -   40 ;
171           var  end  =   0 ;
172          html  +=   ' <table cellspacing="0" cellpadding="0" border="0" style="width:100%;cursor:pointer;background-color:white;border: 1px solid #6D84B4;font-family:verdana, arial, helvetica; font-size:12px;"> ' ;
173          html  +=   ' <tr> ' ;
174           if  (col  !=   1 )
175              html  +=   ' <td style="width:3%" valign="midden" align="center"><img src=" '   +  ImgArr.Left  +   ' " name="year_img_left" vle=" '   +  start  +   ' " /></td> ' ;
176           for  ( var  i  =   0 ; i  <  col; i ++ ) {
177               var  yearStart  =  start  +  (i  *  row);
178               var  yearEnd  =  yearStart  +  row;
179              html  +=   ' <td style="width: '   +  w  +   ' %" align="center"> ' ;
180              html  +=   ' <table cellspacing="0" cellpadding="0" border="0" style="width:100%;font-family:verdana, arial, helvetica; font-size:12px;"> ' ;
181               for  ( var  j  =  yearStart; j  <  yearEnd; j ++ ) {
182                   if  (mid  ==  j)
183                      html  +=   ' <tr><td name=" '   +  (col  ==   1   ?   " monthtd "  :  " yeartd " +   ' " vle=" '   +  j  +   ' " style="height:20px;background-color: #6D84B4"> '   +  (col  ==   1   ?  Month[j  -   1 ] : j)  +   ' </td></tr> ' ;
184                   else
185                      html  +=   ' <tr><td name=" '   +  (col  ==   1   ?   " monthtd "  :  " yeartd " +   ' " vle=" '   +  j  +   ' " style="height:20px;"> '   +  (col  ==   1   ?  Month[j  -   1 ] : j)  +   ' </td></tr> ' ;
186              }
187              html  +=   ' </table> ' ;
188              html  +=   ' </td> ' ;
189              end  =  yearEnd;
190          }
191           if  (col  !=   1 ) {
192              html  +=   ' <td style="width:3%" valign="midden" align="center"> ' ;
193              html  +=   ' <img src=" '   +  ImgArr.Right  +   ' " name="year_img_right" vle=" '   +  end  +   ' " /> ' ;
194              html  +=   ' </td> ' ;
195          }
196          html  +=   ' </tr> ' ;
197          html  +=   ' </table> ' ;
198           return  html;
199      }
200       var  show  =   function  () {
201           var  o  =  getPosXY(currentInput);
202          document.getElementById( " __viewdiv " ).style.top  =  o.top;
203          document.getElementById( " __viewdiv " ).style.left  =  o.left;
204          document.getElementById( " __viewdiv " ).style.display  =   '' ;
205          SetHeight();
206      }
207       var  init  =   function  (dest, today, callbackfn) {
208           if  ( ! dest  ||  dest  ==   "" ) {
209              alert( " No target! " );
210               return ;
211          }
212           if  ( typeof  dest  ==   " string " )
213              dest  =  document.getElementById(dest);
214           var  div  =  document.getElementById( " body_div_temp_ " );
215           if  ( ! div) {
216              div  =  document.createElement( " div " );
217              div.id  =   " body_div_temp_ " ;
218              document.body.appendChild(div);
219          }
220           var  span  =  document.createElement( " span " );
221          span.innerHTML  =  (today  &&  today  ===   1   ?   ' &nbsp;<a href="javascript:void(0);">Today</a> '  :  "" +   ' &nbsp;<img src="images/icon_calendar.gif" /> ' ;
222          dest.parentNode.insertBefore(span, dest.nextSibling);
223          span.onclick  =  ( function  (obj, callback) {
224               return   function  () {
225                  currentCallback  =  callback;
226                   var  _event  =  arguments[ 0 ||  window.event;
227                   var  target  =  _event.target  ||  _event.srcElement;
228                   var  tagname  =  target.tagName.toLowerCase();
229                   if  (tagname  ==   " a " ) {
230                      obj.value  =   new  Date().format();
231                       if  ( typeof  currentCallback  ==   " function " )
232                          currentCallback();
233                  }
234                   else   if  (tagname  ==   " img " ) {
235                      currentInput  =  obj;
236                      setCalendarDiv(obj.value, div);
237                      show();
238                  }
239                   else
240                       return   false ;
241              }
242          })(dest, callbackfn);
243          div.onclick  =  ( function  (callback) {
244               return   function  () {
245                   var  _event  =  arguments[ 0 ||  window.event;
246                   var  target  =  _event.target  ||  _event.srcElement;
247                   var  tagname  =  target.tagName.toLowerCase();
248                   if  (tagname  ==   " td " ) {
249                       var  name  =  target.getAttribute( " name " );
250                       var  vle  =  target.getAttribute( " vle " );
251                       if  (name  ==   " daytd " ) {
252                          currentInput.value  =  vle
253                          document.getElementById( " __viewdiv " ).style.display  =   ' none ' ;
254                           if  ( typeof  callback  ==   " function " )
255                              callback();
256                      }
257                       else   if  (name  ==   " yeartd " ) {
258                           var  text  =  GetIndex(Month, document.getElementById( " __monthSpan " ).innerHTML)  +   " / "   +   1   +   " / "   +  vle;
259                          setCalendarDiv(text, div);
260                          show();
261                      }
262                       else   if  (name  ==   " monthtd " ) {
263                           var  text  =  vle  +   " / "   +   1   +   " / "   +  document.getElementById( " __yearSpan " ).innerHTML;
264                          setCalendarDiv(text, div);
265                          show();
266                      }
267                  }
268                   else   if  (tagname  ==   " img " ) {
269                       var  name  =  target.getAttribute( " name " );
270                       var  vle  =  target.getAttribute( " vle " );
271                       if  (name  ==   " btnClose " ) {
272                          div.innerHTML  =   "" ;
273                      }
274                       if  (name  ==   " year_img_left "   ||  name  ==   " year_img_right " ) {
275                          showYearMonth( " yearDiv " , div, document.getElementById( " __yearSpan " ), parseInt(vle));
276                      }
277                       if  (name  ==   " navLeft "   ||  name  ==   " navRight "   ||  name  ==   " left "   ||  name  ==   " right " ) {
278                           var  y  =  parseInt(document.getElementById( " __yearSpan " ).innerHTML);
279                           var  m  =  GetIndex(Month, document.getElementById( " __monthSpan " ).innerHTML);
280                           if  (name  ==   " navLeft " )
281                              y  -=   1 ;
282                           if  (name  ==   " navRight " )
283                              y  +=   1 ;
284                           if  (name  ==   " left " )
285                              m  -=   1 ;
286                           if  (name  ==   " right " )
287                              m  +=   1 ;
288                           var  text  =  m  +   " / "   +   1   +   " / "   +  y;
289                          setCalendarDiv(text, div);
290                          show();
291                      }
292                  }
293                   else   if  (tagname  ==   " span " ) {
294                       if  (target.id  ==   ' __monthSpan ' ) {
295                          showYearMonth( " monthDiv " , div, target, GetIndex(Month, target.innerHTML));
296                      }
297                       else   if  (target.id  ==   " __yearSpan " ) {
298                          showYearMonth( " yearDiv " , div, target, parseInt(target.innerHTML));
299                      }
300                  }
301                   else
302                       return   false ;
303              }
304          })(callbackfn);
305      }
306       var  isArray  =   function  (vle) {
307           return  Object.prototype.toString.call(vle)  ===   " [object Array] " ;
308      }
309      that.ready  =   function  (ArrID, today, callbackfn) {
310           if  ( ! isArray(ArrID))
311              ArrID  =  [ArrID];
312           for  ( var  i  =   0 , len  =  ArrID.length; i  <  len; i ++ ) {
313              init(ArrID[i], today, callbackfn);
314          }
315      }
316       return  that;
317  })();

 

下载地址 /Files/yithcn/Calender.rar

 

转载于:https://www.cnblogs.com/yithcn/archive/2011/01/20/1940425.html

这篇关于看了博友auntion的【擅用事件代理,警惕闭包的性能陷阱】真是一语惊醒梦中人的感觉...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738856

相关文章

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论