Pickadate v3.5.6添加自定义昨日按钮时render不保留代码问题求解
问题原因
你的判断完全正确:picker.render()和picker.open()调用时都会重新生成日期选择器的完整DOM结构,你仅在页面初始化时插入一次的Yesterday按钮会被新渲染的结构直接覆盖,并不是render方法不生效,是插入按钮的时机不对。
解决方案
将插入自定义按钮的逻辑绑定到Pickadate的render事件中,每次渲染完成后自动插入按钮,就不会再出现按钮丢失的问题,修改后的代码如下:
$('#datepicker').pickadate({ format: 'mm/dd/yyyy', selectYears: true, selectMonths: true, editable: true, max: true, container: '#pickadate-container' }); $(function(){ var $btn = $('.pickadate-trigger'), $input = $('#datepicker'), picker = $input.pickadate('picker'); // 绑定render事件,每次渲染完成后执行按钮插入逻辑 picker.on('render', function() { // 先判断按钮是否存在,避免重复插入 if ($('#yesterdayBtn').length === 0) { $("#pickadate-container").find('.picker__footer').prepend('<button class="picker__button--today" type="button" id="yesterdayBtn" aria-controls="datepicker">Yesterday</button>'); } // 可在这里补充Yesterday按钮的点击逻辑,示例为自动选中昨天的日期 $('#yesterdayBtn').off('click').on('click', function() { var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); picker.set('select', yesterday); picker.close(); }); }); $btn.on('click', function(e){ e.preventDefault(); e.stopPropagation(); // open方法会自动触发渲染,无需额外调用render picker.open(); }); });
优化说明
- 原逻辑中手动调用的
picker.render()属于冗余操作,picker.open()会自动触发渲染流程,删除后可以减少一次不必要的DOM重建 - 插入按钮前先做存在性判断,可以避免多次渲染重复插入相同节点
- 按钮的点击事件绑定在render事件内执行,可以避免DOM重建后原有绑定的事件失效
内容的提问来源于stack exchange,提问作者LoekGenbu
相关产品推荐
相关产品推荐

