This question already has answers here:
Cancel/kill window.setTimeout() before it happens
                                
                                    (2个答案)
                                
                        
                                3年前关闭。
            
                    
免责声明:我不是非常精通Javascript,并且.net程序中有这个小的JS代码部分。

我有2个下拉列表,即ReportList和YearList。第一个选择的值使用AJAX动态填充第二个下拉列表。问题是,每次选择一个ReportList时,它都会查询数据库。 ReportList中至少可以包含200个条目,并且当用户在下拉列表中使用鼠标滚轮时,该应用程序将在短时间内进行数百个查询,并使数据库崩溃。到目前为止,我有这个

             $('#ReportList').change(function () {
             setTimeout(function () { PopulateYearsDropdownList() }, 2000);
         });


我玩过stopPropagation(),但没有用。我无法非常高效地对其进行测试,因为即使测试数据库也由其他人托管和维护。

我希望能够滚动浏览而不会提示查询量与经过的报告数量一样多的查询。我正在考虑增加一个小的延迟,每个函数“ .change”取消最后一个函数调用。

我认为从一开始就没有真正考虑过这一点,但是我想在短时间内解决这个问题。

最佳答案

我建议将setTimeout分配给变量(具有适当的作用域可访问性),并使用clearTimeout停止超时。

阅读有关setTimeoutclearTimeout的更多信息。

一个示例如下所示:

var myTimeout;
$('#ReportList').change(function () {
    if (myTimeout) clearTimeout(myTimeout);
    myTimeout = setTimeout(function () { PopulateYearsDropdownList() }, 2000);
});

09-20 04:36