javascript - 根据当前日期的时间隐藏元素
问题描述
我正在使用 jquery 中的 ui-datepicker 日历,并且我试图仅在当天上午 10 点之前隐藏以下选项的元素 option:nth-child(2):
<select name="delivery_time_frame" id="delivery_time_frame" class="select " data-allow_clear="true" data-placeholder="Choose a time of delivery ">
<option value="">Choose a time of delivery </option>
<option value="time_frame:0">12:00 – 14:00</option>
<option value="time_frame:1">14:00 – 16:00</option>
<option value="time_frame:2">16:00 – 18:00</option>
<option value="time_frame:3">18:00 – 20:00</option>
</select>
通过使用查询选择器:
document.querySelector("#delivery_time_frame > option:nth-child(2)")
例如,如果时间仅在当天上午 10:00 之前,我想隐藏第一个选项。如果有人在日历中选择了超出当前日期的日期,我不想隐藏。例如,如果在 datepicker 日历中选择了任何第二天,我不会隐藏元素;我希望它可见以供选择。
这样做的重点是,如果有人选择在日历中交付同一天,我想要除第一个之外的所有选项(从 14:00 到 20:00)。如果选择任何其他日期交付,我希望所有选项都可用。
谢谢你的帮助!
解决方案
您应该将一个最小的示例发布为代码,以便其他人可以尽可能轻松地重现您的问题。我已经模拟了一些支持的东西,可能不是你所拥有的,但对于一个例子来说已经足够了。
我会禁用该选项而不是隐藏它,以便用户知道该选项在那里,只是在他们选择的日期不可用(有关该效果的消息也可能有所帮助)。
必须有关联的日期选择才能知道用户选择了哪个日期才能启用或禁用该选项。该元素需要一个监听器来修改时间选择中的选项,例如
// Helpers
function formatDate(date) {
let z = n=>(n<10?'0':'')+n;
return `${date.getFullYear()}-${z(date.getMonth()+1)}-${z(date.getDate())}`;
}
function parseISOLocal(s) {
let [y,m,d] = s.split('-');
return new Date(y, --m, d);
}
// Hide option if before 10 am today
function checkSelected() {
// Get today's date
let today = new Date();
// Get date formatted for comparision with value in select
let todayStamp = formatDate(today);
// Get selected date
let selectedDate = this.value; //document.getElementById('delivery_date').value
// Get target option
let opt = document.querySelector('#delivery_time_frame > option:nth-child(2)');
// If it's today and before 10, hide option
if (selectedDate == todayStamp && today.getHours() < 10) {
console.log('disable ' + opt.value);
opt.disabled = true;
// Deselect in case it's been selected
opt.selected = false;
} else {
opt.disabled = false;
console.log('enable ' + opt.value);
}
}
window.onload = function(){
// Insert some dates in delivery_date
let now = new Date();
let select = document.getElementById('delivery_date');
for (let i=0; i<3; i++) {
let d = formatDate(now);
select.appendChild(new Option(d, d));
now.setDate(now.getDate() + 1);
}
// Attach listener on select
let sel = document.querySelector('#delivery_date');
if (sel) {
sel.addEventListener('change', checkSelected, false);
}
};
<select name="delivery_date" id="delivery_date">
<option selected>Select a delivery date
</select>
<select name="delivery_time_frame" id="delivery_time_frame" class="select " data-allow_clear="true" data-placeholder="Choose a time of delivery ">
<option value="" selected>Choose a time of delivery </option>
<option value="time_frame:0">12:00 – 14:00</option>
<option value="time_frame:1">14:00 – 16:00</option>
<option value="time_frame:2">16:00 – 18:00</option>
<option value="time_frame:3">18:00 – 20:00</option>
</select>
它还需要处理用户是否已经选择了时间(上面没有尝试,因为我不知道你需要实现什么其他逻辑)。
在用户选择日期之前,您也可以禁用时间选择。
推荐阅读
- html - 如何制作小部件侧边栏图标?
- sql-server - 如何检查 dbgrid 中 TADODataSet 的可用性?
- django - 我在 Django 中的所有静态文件都没有找到,但是 findstatic 找到了
- java - Spring Boot导致工作代码失败
- bash - sed 仅在第一次匹配后插入文本行并在第二次匹配后删除 n 行仅使用 sed
- kotlin - Kotlin:使用 getter 实现接口的问题
- r - 使用行名称作为 x 绘制数据框值 - 无法强制错误(列表)对象键入“双精度”
- installation - Drupal 8,刚安装完,css文件无法加载,服务器报错500
- hadoop - 无法打开 localhost:8088。尝试在 Windows10 上安装 Hadoop3
- igraph - 在 r 图中读取 graphml 文件时出错