传单:不要在双击时触发点击事件功能
leaflet: don't fire click event function on doubleclick
我有一个关于点击传单中地图的问题。如果我点击地图我想在那里设置一个标记,但如果双击地图我只想放大而不设置标记。所以我有以下代码:
var map = L.map(attrs.id, {
center: [scope.lat, scope.lng],
zoom: 14
});
var marker = L.marker([scope.lat, scope.lng],{draggable: true});
map.on('click', function(event){
marker.setLatLng(event.latlng);
marker.addTo(map);
});
现在的问题是,当我在地图上双击时,点击事件也会被触发,我想删除该行为。我怎样才能做到这一点?
谢谢
玛格达
所以,我找到了一种方法来做到这一点,我仍然不确定是否有更好的方法来做到这一点。
var map = L.map(attrs.id, {
center: [scope.lat, scope.lng],
zoom: 14
});
map.clicked = 0;
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18
}).addTo(map);
var marker = L.marker([scope.lat, scope.lng],{draggable: true});
map.on('click', function(event){
map.clicked = map.clicked + 1;
setTimeout(function(){
if(map.clicked == 1){
marker.setLatLng(event.latlng);
marker.addTo(map);
map.clicked = 0;
}
}, 300);
});
map.on('dblclick', function(event){
map.clicked = 0;
map.zoomIn();
});
在侦听 dblclick
时遇到了同样的问题,即 2 x 不需要的 click
事件被触发。
注意:我想在同一个元素上单击和双击以执行不同的操作。
我将这种方法应用到我的传单地图中,它不是防弹的,但消除了 99% 的冲突:
var timer = 0;
var delay = 200;
var prevent = false;
$("#target")
.on("click", function() {
timer = setTimeout(function() {
if (!prevent) {
doClickAction();
}
prevent = false;
}, delay);
})
.on("dblclick", function() {
clearTimeout(timer);
prevent = true;
doDoubleClickAction();
});
来源:CSS-Tricks
这在最近的 (leaflet 1.4) 版本中仍然是一个问题。
我使用的替代方法:
setTimeout
和 clearTimeout
的合法用法
- 没有向地图对象添加随机道具
- 没有jQuery:
map.on('click', function(event) {
if (_dblClickTimer !== null) {
return;
}
_dblClickTimer = setTimeout(() => {
// real 'click' event handler here
_dblClickTimer = null;
}, 200);
})
.on("dblclick", function() {
clearTimeout(_dblClickTimer);
_dblClickTimer = null;
// real 'dblclick' handler here (if any). Do not add anything to just have the default zoom behavior
});
请注意,必须测试 200
毫秒延迟。在我的环境中,使用 100
之类的值是不够的,因为双击事件会延迟触发。
我有一个关于点击传单中地图的问题。如果我点击地图我想在那里设置一个标记,但如果双击地图我只想放大而不设置标记。所以我有以下代码:
var map = L.map(attrs.id, {
center: [scope.lat, scope.lng],
zoom: 14
});
var marker = L.marker([scope.lat, scope.lng],{draggable: true});
map.on('click', function(event){
marker.setLatLng(event.latlng);
marker.addTo(map);
});
现在的问题是,当我在地图上双击时,点击事件也会被触发,我想删除该行为。我怎样才能做到这一点?
谢谢 玛格达
所以,我找到了一种方法来做到这一点,我仍然不确定是否有更好的方法来做到这一点。
var map = L.map(attrs.id, {
center: [scope.lat, scope.lng],
zoom: 14
});
map.clicked = 0;
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18
}).addTo(map);
var marker = L.marker([scope.lat, scope.lng],{draggable: true});
map.on('click', function(event){
map.clicked = map.clicked + 1;
setTimeout(function(){
if(map.clicked == 1){
marker.setLatLng(event.latlng);
marker.addTo(map);
map.clicked = 0;
}
}, 300);
});
map.on('dblclick', function(event){
map.clicked = 0;
map.zoomIn();
});
在侦听 dblclick
时遇到了同样的问题,即 2 x 不需要的 click
事件被触发。
注意:我想在同一个元素上单击和双击以执行不同的操作。
我将这种方法应用到我的传单地图中,它不是防弹的,但消除了 99% 的冲突:
var timer = 0;
var delay = 200;
var prevent = false;
$("#target")
.on("click", function() {
timer = setTimeout(function() {
if (!prevent) {
doClickAction();
}
prevent = false;
}, delay);
})
.on("dblclick", function() {
clearTimeout(timer);
prevent = true;
doDoubleClickAction();
});
来源:CSS-Tricks
这在最近的 (leaflet 1.4) 版本中仍然是一个问题。
我使用的替代方法:
setTimeout
和clearTimeout
的合法用法
- 没有向地图对象添加随机道具
- 没有jQuery:
map.on('click', function(event) {
if (_dblClickTimer !== null) {
return;
}
_dblClickTimer = setTimeout(() => {
// real 'click' event handler here
_dblClickTimer = null;
}, 200);
})
.on("dblclick", function() {
clearTimeout(_dblClickTimer);
_dblClickTimer = null;
// real 'dblclick' handler here (if any). Do not add anything to just have the default zoom behavior
});
请注意,必须测试 200
毫秒延迟。在我的环境中,使用 100
之类的值是不够的,因为双击事件会延迟触发。