动态添加带日期的任务功能异常:输入日期后无法添加任务
动态添加带日期的任务功能异常:输入日期后无法添加任务
嘿,我找到你这个问题的根源啦!其实是表单的默认提交行为在搞小动作,咱们一步步说清楚:
你点击弹窗里的「Add Task」按钮时,这个按钮是type="submit"类型的,会触发表单的默认提交动作——页面会刷新!这就导致:
- 当你只填任务名称、没填日期时,浏览器的
required验证会阻止表单提交,页面不刷新,addTask()函数的效果能正常显示; - 当你填了日期(满足验证要求),表单就会提交,页面瞬间刷新,刚添加的任务还没来得及展示就没了,看起来像是函数没工作。
知道问题了就好办,给你两个简单的解决方案:
方案一:修改按钮类型(最直接)
把弹窗里的按钮从type="submit"改成type="button",这样它就只会触发addTask()函数,不会提交表单:
<button type="button" id="addTask-btn2" onclick="addTask()">Add Task</button>
方案二:阻止表单默认提交(更严谨,还能优化体验)
如果想保留表单的验证逻辑,咱们可以在addTask()里阻止默认提交行为,顺便还能加一些用户体验优化(比如清空输入框、自动关闭弹窗):
function addTask(e) { // 阻止表单默认提交,避免页面刷新 e.preventDefault(); var taskName = document.getElementById('taskName').value; var taskDate = document.getElementById('taskDate').value; var taskContainer = document.querySelector('.task-container'); // 动态生成唯一的任务ID,避免多个任务的checkbox和label关联错误 const taskId = `task${taskContainer.children.length + 1}`; // 把日期转成更友好的格式(比如从YYYY-MM-DD转成「2 December」) const formattedDate = new Date(taskDate).toLocaleDateString('en-US', { day: 'numeric', month: 'long' }); var task = document.createElement('div'); task.className = 'task'; task.innerHTML = `<input type="checkbox" id="${taskId}" name="${taskId}" value="${taskId}"><label for="${taskId}">${taskName}</label><p>${formattedDate}</p>`; taskContainer.appendChild(task); // 清空输入框,方便下次添加 document.getElementById('taskName').value = ''; document.getElementById('taskDate').value = ''; // 自动关闭弹窗 document.getElementsByClassName('addTaskPopUp')[0].style.display = 'none'; }
然后修改按钮的onclick,把事件传进去:
<button type="submit" id="addTask-btn2" onclick="addTask(event)">Add Task</button>
另外还有个小细节:你原来的代码里,每个新任务的checkbox id都是task2,这会导致多个任务的label和checkbox关联混乱,上面的方案二已经帮你改成动态生成唯一ID啦~
备注:内容来源于stack exchange,提问作者Imran
相关产品推荐
相关产品推荐

