pickadate中如何让select动态获取的禁用日期变量生效?
解决pickadate动态设置禁用日期不生效的问题
哎,这个坑我之前踩过!问题出在你拿到的disableddays的数据类型上——你通过data()获取到的其实是一个逗号分隔的字符串(比如"2,3,4,5"),但pickadate的disable选项需要的是数字类型的数组(比如[2,3,4,5]),直接把字符串塞进去插件肯定识别不了。
核心原因
你之前写的disable: [ disableddays ],实际传递的是一个包含字符串的数组:["2,3,4,5"],而插件期望的是每个元素都是数字的数组,所以自然不会生效。换成直接写字符串"2,3,4,5"能工作,是因为插件内部做了隐式的字符串转数组处理,但用变量的时候就没这个待遇啦。
解决方案:把字符串转换成数字数组
只需要在获取到disableddays后,做两步处理:
- 用
split(',')把字符串按逗号分割成字符串数组 - 用
map(Number)把每个字符串元素转换成数字
修改后的代码如下:
首先在onchange事件里处理变量:
// 获取选中项的data属性值(字符串) var disabledDaysStr = $(this).find(':selected').data('disableddays'); // 转换成数字数组 var disabledDaysArray = disabledDaysStr.split(',').map(Number);
然后初始化pickadate时,直接传递这个数组:
var picker = $('#tripstart').pickadate({ format: 'd.mm.yyyy', min: new Date($mystart), max: new Date($myend), firstDay: 1, disable: disabledDaysArray // 注意这里不用再包一层[]了 });
更健壮的处理(可选)
如果担心data属性可能为空、有多余空格或者无效字符,可以加个判断和过滤:
var disabledDaysArray = []; var disabledDaysStr = $(this).find(':selected').data('disableddays'); if (disabledDaysStr) { disabledDaysArray = disabledDaysStr.split(',') .map(function(item) { // 先去除每个元素的前后空格,再转成数字 return parseInt(item.trim(), 10); }) .filter(function(num) { // 过滤掉转换失败的非数字项 return !isNaN(num); }); }
这样无论data属性里是"2,3,4,5"还是" 2 , 3 ,4 ,5 ",都能正确转换成[2,3,4,5],确保pickadate能正常识别禁用日期。
内容的提问来源于stack exchange,提问作者Florian Sauerwein
相关产品推荐
相关产品推荐

