我使用我使用狡猾的工具darsa.in创建的日期选择器,一切都很完美,除非用户更改日期太快JavaScript不会触发函数的正确日期。< / p>
有没有办法:
if (datepicker not active for x seconds)
或者有没有办法创建变量并仅在x时间内该变量没有变化时触发该函数?我需要给JS一些时间,因此在用户处于他定位的日期之前不会触发该功能。
以下是一些代码。
当一天中的日期选择器发生变化时,我会调用loadDateMatches()
将所有匹配项加载到HTML中。但是,如果您在第1天和第5天之间非常快地更改,则可能会在第3天停止加载比赛。
我正在寻找一种方法不触发功能loadDateMatches()
,直到有一段时间没有更改日期。
days.on('active', function (eventName) {
activeDate= this.rel.activeItem;
var logDate = new Date(d.getFullYear(), 0, activeDate + first + 1);
var startTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 0, 0, 0);
DayBarConditions.startTime = startTime.getTime()/1000;
var endTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 23, 59, 59);
DayBarConditions.endTime = endTime.getTime()/1000;
if (typeof loadDateMatches == 'function') {
loadDateMatches();
}
});
答案 0 :(得分:0)
尝试让日期选择器在延迟时调用函数,该延迟首先检查设置日是否与更改时相同,然后加载信息(如果是)。我相信下面的代码应该是可用的,但它是未经测试的。
days.on('active', function (eventName) {
activeDate= this.rel.activeItem;
// We have to put this in a separate function, so that it evaluates activeDate
// when the date picker is changed, not when activateDelayed is called
(function(activeDate) {
//Activate the function after .5 seconds if date remains unchanged
window.setTimeout(activateDelayed, 500, activeDate);
})(activeDate);
};
function activateDelayed (oldDate) {
activeDate = days.rel.activeItem;
if (oldDate == activeDate) {
var logDate = new Date(d.getFullYear(), 0, activeDate + first + 1);
var startTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 0, 0, 0);
DayBarConditions.startTime = startTime.getTime()/1000;
var endTime = new Date(logDate.getFullYear(), logDate.getMonth(), logDate.getDate(), 23, 59, 59);
DayBarConditions.endTime = endTime.getTime()/1000;
if (typeof loadDateMatches == 'function') {
loadDateMatches();
}
}
});
答案 1 :(得分:0)
您可以使用此代码来跟踪执行loadDateMatches
时所拥有的请求的数量。当它是第一个时,该功能立即执行,但请求计数器不会减少,直到冷却期也过去。只有这样,柜台才会减少。当该计数器为1时,可以添加另一个请求,但只有在第一个冷却期到期时才会执行。在冷却期间的任何更多请求都不会改变任何内容 - 最多一个请求将在冷却后等待执行:
var requests = 0;
days.on('active', function (eventName) {
// ... your existing code, setting DayBarConditions properties, comes here.
// ...
if (typeof loadDateMatches == 'function') {
// Keep track of number of requests
if (requests < 2) requests++;
// Ignore this when there is currently a cool-down ongoing, and
// another execution is already pending:
if (requests == 2) return;
(function loop() {
loadDateMatches();
setTimeout(function () {
// Cool down has passed: repeat when new request is pending
if (--requests) loop();
}, 500);
})();
}
});
因此,此代码不会延迟第一个请求,但会引入一个冷却期,在此期间,任何进一步的请求将合并为一个,并且只有在该冷却期到期时才会执行。
但根据您在loadDateMatches
中运行的代码,可能会有更好的解决方案。