javascript窗口.setTimeout在特定情况下执行两次
javascript window.setTimeout executes twice in a particular case
我有一个问题使用setTimeout。我已经用了很多次了,它总是按照我期望的方式工作。即使我把代码放在一个单独的函数中,它也能工作,但只是在这种情况下,它有一个奇怪的行为。
下面是代码:
RoutePatternPoint.prototype.showOnMap = function(map)
{
var that = this;
google.maps.event.addListener(this.marker, "click", function(event)
{
window.setTimeout(function(){
if(RoutePatternPoint.markerDoubleClickFix === false) { doSomething(); }
RoutePatternPoint.markerDoubleClickFix = false;
},350);
});
google.maps.event.addListener(this.marker, "dblclick", function(event)
{
RoutePatternPoint.markerDoubleClickFix = true;
});
}
问题是google maps api v3有一个bug,当实现单次和双击事件时,它们都被执行。
因此,解决方案是减慢单次单击事件和,如果执行了双击事件,请参见。如果双击事件被执行,那么我们将中断单次点击事件。不幸的是,我的代码不是我想要的方式工作,所以我决定写一些警报函数,看看会发生什么。你猜怎么着?单次点击事件中的setTimeout函数执行两次。
我做错了什么?
您应该在用户点击时显示(https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf):
RoutePatternPoint.prototype.showOnMap = function (map) {
var that = this;
google.maps.event.addListener(this.marker, "click", function (event) {
if (that.clickHandler) {
window.clearTimeout(that.clickHandler);
}
that.clickHandler = window.setTimeout(function () {
doSomething();
}, 350);
});
google.maps.event.addListener(this.marker, "dblclick", function (event) {
if (that.clickHandler) {
window.clearTimeout(that.clickHandler);
that.clickHandler = null;
}
});
}
我不认为Google Maps API v3触发单点和双击事件是一个bug。这在很多情况下都很有用。
相关文章:
- 防止双击执行两次jQuery post请求
- 单击元素两次后执行操作
- 为什么这个函数执行了两次
- 使用node.js模块,在什么情况下模块会被执行两次
- 必须点击两次按钮才能执行功能
- 是否可以执行两次匿名函数
- onKeyUp 导致代码执行两次
- 选中复选框后函数执行两次
- ng 类指令调用执行两次
- 提交按钮有时会以 html 形式执行两次操作
- 必须单击按钮两次才能执行功能 - jQuery
- AngularJs 基本应用程序执行两次
- jQuery AJAX POST 执行两次
- 防止脚本在执行时运行两次
- jquery ready 函数在我单击锚标记时执行两次
- document.getElementById 导致 jquery 文档准备执行两次
- CasperJS thenOpen() 执行两次
- 脚本执行两次,但时间戳相同
- 在 IE 上,表达式执行两次
- 在angularjs中两次执行控制器的routeparams中的特殊字符