超时后遇验证错误,如何切换问卷页面?
问题场景与解决方案
当问卷页面设置了最大完成时间,且页面内问题带有必填项或自定义验证器时,超时后计时器会停在0:00,验证器触发报错,导致无法切换页面。典型场景如课堂测试:平时需要必填规则防止漏答,但超时后必须强制停止答题并跳转。
现有临时方案(逐个清除问题验证器、取消必填)存在扩展性差、修改原始配置的缺陷;手动设置currentPage切换页面时,会因onTimerTick持续触发出现重复切换问题。
方案1:批量处理页面问题+单次执行控制
通过遍历页面所有问题批量修改验证规则,同时添加状态标记避免重复执行逻辑:
// 标记是否已处理超时逻辑,防止重复触发 let hasHandledTimeout = false; survey.onTimerTick.add((sender, options) => { const currentPage = sender.currentPage; if ( currentPage.name === "myPage" && currentPage.timeSpent >= currentPage.maxTimeToFinish && !hasHandledTimeout ) { hasHandledTimeout = true; // 批量处理当前页面所有问题 currentPage.questions.forEach(q => { q.clearErrors(); q.setPropertyValue("validators", []); q.setPropertyValue("isRequired", false); }); // 跳转至下一页 sender.currentPage = sender.getNextPage(); } });
方案2:拦截页面验证(更安全,不修改原始配置)
利用onValidatePage事件,超时后直接跳过页面验证逻辑,无需修改问题配置:
let isPageTimedOut = false; survey.onTimerTick.add((sender, options) => { const currentPage = sender.currentPage; if ( currentPage.name === "myPage" && currentPage.timeSpent >= currentPage.maxTimeToFinish ) { isPageTimedOut = true; // 停止计时器,减少不必要的事件触发 currentPage.stopTimer(); // 触发页面跳转 sender.currentPage = sender.getNextPage(); } }); // 拦截页面验证流程,超时后强制标记为有效 survey.onValidatePage.add((sender, options) => { if (options.page.name === "myPage" && isPageTimedOut) { options.isValid = true; options.errors = []; } });
关键注意事项
- 必须添加状态标记(如
hasHandledTimeout/isPageTimedOut),避免onTimerTick持续触发导致重复执行。 - 超时后调用
currentPage.stopTimer()可停止计时器,减少冗余事件。 - 方案2无需修改问卷原始配置,更适配复杂问卷场景。
内容的提问来源于stack exchange,提问作者Jakub Jędrusiak
相关产品推荐
相关产品推荐

