Javascript 等待某物停止以触发功能

Javascript 等待某物停止以触发功能,javascript,jquery,css,sly-scroller,Javascript,Jquery,Css,Sly Scroller,我使用的是我用sly工具创建的日期选择器,一切都很完美,只是如果用户更改日期太快,JavaScript不会触发函数的正确日期 有没有办法做到: if (datepicker not active for x seconds) 或者,是否有一种方法可以创建一个变量并仅当该变量在x时间内没有变化时才触发该函数?我需要给JS一些时间,这样它在用户到达目标日期之前不会触发函数 下面是一些代码 当每日选取器发生变化时,我调用loadDateMatches(),将所有匹配项加载到HTML中。但是如果你在

我使用的是我用sly工具创建的日期选择器,一切都很完美,只是如果用户更改日期太快,JavaScript不会触发函数的正确日期

有没有办法做到:

if (datepicker not active for x seconds) 
或者,是否有一种方法可以创建一个变量并仅当该变量在x时间内没有变化时才触发该函数?我需要给JS一些时间,这样它在用户到达目标日期之前不会触发函数

下面是一些代码

当每日选取器发生变化时,我调用
loadDateMatches()
,将所有匹配项加载到HTML中。但是如果你在第一天到第五天之间很快改变,它可能会在第三天停止加载匹配项

我正在寻找一种方法来不触发函数
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();
    }
});

尝试让日期选择器在延迟时调用一个函数,该函数首先检查设置的日期是否与更改日期相同,然后加载信息(如果相同)。我相信下面的代码应该是功能性的,但是它没有经过测试

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

尝试让日期选择器在延迟时调用一个函数,该函数首先检查设置的日期是否与更改日期相同,然后加载信息(如果相同)。我相信下面的代码应该是功能性的,但是它没有经过测试

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

您可以使用此代码,它跟踪执行
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);
        })();
    }
});
var请求=0;
days.on('active',函数(eventName){
//…设置DayBarConditions属性的现有代码出现在这里。
// ...
if(loadDateMatches的类型=='function'){
//跟踪请求的数量
如果(请求数<2)请求数++;
//当当前正在进行冷却时,忽略此项,并且
//另一个执行已挂起:
如果(请求==2)返回;
(函数循环(){
loadDateMatches();
setTimeout(函数(){
//冷却已过:当新请求挂起时重复
if(--requests)循环();
}, 500);
})();
}
});
因此,这段代码不会延迟第一个请求,而是引入了一个冷却期,在此期间,任何进一步的请求都会加入到一个请求中,并且只有在冷却期结束时才会执行


但是,根据您在
loadDateMatches

中运行的代码,可能会有更好的解决方案。您可以使用此代码,它跟踪您执行
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);
        })();
    }
});
var请求=0;
days.on('active',函数(eventName){
//…设置DayBarConditions属性的现有代码出现在这里。
// ...
if(loadDateMatches的类型=='function'){
//跟踪请求的数量
如果(请求数<2)请求数++;
//当当前正在进行冷却时,忽略此项,并且
//另一个执行已挂起:
如果(请求==2)返回;
(函数循环(){
loadDateMatches();
setTimeout(函数(){
//冷却已过:当新请求挂起时重复
if(--requests)循环();
}, 500);
})();
}
});
因此,这段代码不会延迟第一个请求,而是引入了一个冷却期,在此期间,任何进一步的请求都会加入到一个请求中,并且只有在冷却期结束时才会执行


但是可能会有更好的解决方案,这取决于您在
loadDateMatches

中运行的代码。您可以添加一些代码以便人们可以看到您正在尝试做什么吗?我添加了它,但无论如何,我知道这很难理解我正在遇到的问题。我的英语一点也不完美,对不起,试试datepicker附带的On select函数----你可以结合On close函数。使用这两个函数,您可以停止从执行中启动其他函数。您可以提供
loadDateMatches
的代码吗?或者在延迟后调用该函数(使用
setTimeout
),然后让它先检查日期选择器是否保持与以前相同的值?你能添加一些代码让人们看到你在做什么吗?我添加了它,但无论如何我知道这很难理解我在遇到什么。我的英语一点也不完美,对不起,试试datepicker附带的On select函数----你可以结合On close函数。使用这两个函数,您可以停止从执行中启动其他函数。您可以提供
loadDateMatches
?或者在延迟后调用该函数(使用
setTimeout
),并让它首先检查日期选择器是否保持与以前相同的值?