weibo_哆啦A梦有大口袋_0
2017-10-09 15:14
(function(){ // 将全局变量的值赋给局部变量 var datepicker=window.datepicker; var monthData; var $wrapper; //渲染函数 //一般来说,你在业务中碰到这样的请求,需要将一个数据渲染到一个结构中,我们会使用一个模板引擎,但是这里没有依赖任何第三方的模板引擎,所以使用最原始的拼接字符串的方式 datepicker.buildUi=function(year,month){ monthData=datepicker.getMonthData(year,month); var html='<div class="ui-datepicker-header">'+ '<a href="" class="ui-datepicker-btn ui-datepicker-prev-btn"><</a>'+ '<a href="" class="ui-datepicker-btn ui-datepicker-next-btn">></a>'+ '<span class="ui-datepicker-curr-month">'+monthData.year+'-'+monthData.month+'</span>'+ '</div>'+ '<div class="ui-datepicker-body">'+ '<table>'+ '<thead>'+ '<tr>'+ '<th>一</th>'+ '<th>二</th>'+ '<th>三</th>'+ '<th>四</th>'+ '<th>五</th>'+ '<th>六</th>'+ '<th>日</th>'+ '</tr>'+ '</thead>'+ '<tbody>'; for(var i=0;i<monthData.days.length;i++){ var date=monthData.days[i]; //表示每周的第一天 if(i%7===0){ html+='<tr>'; } html+='<td>'+date.showDate+'</td>'; //表示每周的最后一天 if(i%7===6){ html+='</tr>'; } } html+='</tbody>'+ '</table>'+ '</div>'; return html; }; // 渲染 datepicker.render=function(direction){ var year,month; if(monthData){ year=monthData.year; month=monthData.month; } if(direction==='prev') month--; if(direction==='next') month++; var html=datepicker.buildUi(year,month); $wrapper=document.querySelector('.ui-datepicker-wrapper'); //创建包裹层 if(!$wrapper){ $wrapper=document.createElement('div'); document.body.appendChild($wrapper); $wrapper.className='ui-datepicker-wrapper'; } $wrapper.innerHTML=html; }; //为了后面的扩展,不直接将它放入结构中 datepicker.init=function(input){ datepicker.render(); var $input =document.querySelector(input); var isOpen=false; $input.addEventListener('click',function(){ if(isOpen){ $wrapper.classList.remove('ui-datepicker-wrapper-show'); isOpen=false; } else{ $wrapper.classList.add('ui-datepicker-wrapper-show'); //为什么要在点开datepicker之前做一个运算呢,而不是在初始化的时候直接算好给它赋样式呢 //这是因为页面的结构随时可能变动,比如说用户的业务发生了一些状态的变更,导致业务的元素增加或者减少,导致在初始化的时候直接算好的位置在弹出datepicker时,已经发生了改变,所以一般在弹出之前计算位置,这样比较准确一些 var left=$input.offsetLeft; var top=$input.offsetTop; var height=$input.offsetHeight; $wrapper.style.top=top+height+2+'px'; $wrapper.style.left=left+'px'; isOpen=true; } },false); $wrapper.addEventListener('click',function(e){ var $target=e.target; if(!$target.classList.contains('ui-datepicker-btn')) return; //上一月 if($target.classList.contains('ui-datepicker-prev-btn')){ datepicker.render('prev'); } //下一个月 else if($target.classList.contains('ui-datepicker-next-btn')){ datepicker.render('next'); } },false); }; })();
同问我也遇到这个问题了
因为上传图片时间的问题,图片浏览的正确顺序 1 、3、2、4
代码调试显示,执行完下一个月单击事件后,又调到了data.js脚本,同时日历被关闭了
点击上一月和下一月的时候,功能会实现,但是日历会被关闭,反复看了一些老师视频代码,还是没有找出原因了,
进行调试时,流程如下,个人认为是不是立即执行匿名函数的问题
DatePicker组件开发
17743 学习 · 64 问题
相似问题