1

我正在使用我用狡猾的工具darsa.in创建的日期选择器,一切都很完美,除了如果用户更改日期太快,JavaScript 不会触发函数的正确日期。

有没有办法做到:

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();
    }
});
4

2 回答 2

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

于 2016-09-15T13:18:01.017 回答
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();
        }
    }
});
于 2016-09-15T12:34:23.473 回答