datepicker与form repeater联用 克隆后日期选择器不生效
问题根因
问题出在DOM克隆的属性复制逻辑和datepicker的初始化判断规则上:
- 页面DOM就绪时你已经给首个
.ka-datepicker初始化了datepicker,此时该元素会被添加插件专属标记类(比如jQuery UI Datepicker会添加hasDatepicker类),同时元素上会绑定交互事件、挂载实例缓存数据 - 你调用的
$(".owner-item-0").clone()默认会复制所有DOM属性(包括插件添加的标记类),即使手动传参禁止复制事件和缓存数据,标记类依然会被克隆到新元素上 - datepicker插件初始化时会优先检查元素是否存在专属标记类/已绑定实例,命中判断就会直接跳过初始化流程,这就是你遍历调用
.datepicker()对克隆元素无效的核心原因 - 你删掉初始初始化代码后,原始元素没有任何插件标记和绑定,克隆出来的元素是干净的,自然可以正常初始化,但这种方式会导致首屏加载完成后第一个日期选择器不可用,不符合业务需求
最优解决方案
不需要写全局遍历的repeatDatePicker()方法,只需要修改克隆逻辑,两点改动即可:
- 给
clone()传入两个false参数,禁止克隆原有元素的事件和子元素缓存数据,减少冗余数据残留 - 克隆完成后,先清除新元素上的插件残留标记,再仅针对新生成元素内的
.ka-datepicker做初始化,不要重复初始化已经正常工作的旧实例
修改后的克隆代码如下:
$(".owner-item-0").clone(false, false) .appendTo(".owners-group") .removeClass("owner-item-0 d-none") .addClass("owner-item-" + ownersLoop) .find("input[type='text']").val("") .end() // 回退到当前克隆的新容器节点 .find('.ka-datepicker') .datepicker('destroy') // 清除克隆带来的初始化标记、残留事件和数据 .datepicker(); // 仅初始化新节点内的日期选择器
原有DOM就绪时的初始化代码可以完全保留,不会产生冲突。
备选兼容方案
如果你已经有其他逻辑依赖默认的clone行为,也可以保留全局初始化的方法,但初始化前必须先销毁已存在的datepicker实例,避免插件跳过初始化:
function repeatDatePicker() { $('.ka-datepicker').each(function() { // 先销毁已绑定的实例、清除标记,再重新初始化 $(this).datepicker('destroy').datepicker(); }); }
注意这个方案每次调用都会销毁重建页面上所有的datepicker实例,性能不如只初始化新节点的方案,适合快速修复场景使用。
内容的提问来源于stack exchange,提问作者Kareimovich
相关产品推荐
相关产品推荐

