鼠标滚动不适用于 Google 地图上附加的 div
Mouse scroll not working on appended div on Google map
我在 Google 地图的中心添加了一个固定标记:
css 对于 div:
.centerMarker{
width:30px;
height:60px;
margin:auto;
position:absolute;
top:50%;
left:50%;
z-index:2;
background:url('fixedMarker.png') no-repeat center;
background-size:30px 60px;
margin-top:-60px;
margin-left:-15px;
}
将 div 添加到地图的脚本:
$('<div/>').addClass('centerMarker').appendTo(map.getDiv())
这会导致滚动(用于缩放)在附加的 div 上不起作用(但在地图的其他部分上起作用)。如何让滚动事件通过 div 到达地图?
编辑: 我需要这个 div 可以点击。所以我不应该禁用此 div.
上的所有事件
由于 Google 地图 iframe 仅在按下 ctrl
时才起作用,您可以使用 JQuery 事件使 centerMarker
在 ctrl
时对事件不敏感]被按下,像这样:
$("window").keydown((e) => {
if (e.keyCode == 17) {
$(".centerMarker").css("pointer-events", "none");
}
});
$("window").keyup((e) => {
if (e.keyCode == 17) {
$(".centerMarker").css("pointer-events", "all");
}
});
#parent {
position: relative;
}
.centerMarker {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parent"><iframe width="700" height="440" src="https://maps.google.com/maps?width=700&height=440&hl=en&q=Paris%2C%20France+(Titre)&ie=UTF8&t=&z=10&iwloc=B&output=embed" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
<div class="centerMarker">
test
</div>
</div><br />
现在的问题是,当您点击 iframe 时,您会关注它并且 keydown 事件不再触发,您必须点击它以外的地方才能使其再次工作。
我真的不明白你为什么需要它,而且你还没有提供完整的代码和用例。
您可以做的是:按照我的建议使用标准标记,然后在 dragstart
上隐藏标记并显示您的自定义绝对元素。在 dragend
上隐藏元素,重新定位标记并再次显示它。这样您就可以保持本机标记行为,并且在拖动时不会看到延迟。
如果你想像你的问题建议的那样使用滚轮缩放,那么你就会遇到问题。滚轮缩放将地图缩放到鼠标光标所在的位置(而不是朝向地图中心),这意味着缩放后,您的标记将不再位于中心。所以在这种情况下,您需要在缩放后重新居中地图。我使用了以下内容:
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(marker.getPosition());
});
如果您不这样做,那么您的绝对定位标记将不再位于您真正的标记所在的位置...
这是一个有效的代码片段。请注意,如果使用信息窗口,您还会遇到一些问题。如果标记距离 canvas 边缘太近,Infowindows 可能会导致地图重新定位(例如,如果您将地图高度设置为 150px...,就会发生这种情况)。您可能还需要在拖动地图时将其隐藏,否则它会停留在同一位置。
换句话说,这听起来像是 "just" 在拖动地图和重新定位标记时看不到一点延迟的很多 hack... IMO
function initialize() {
var mapOptions = {
zoom: 14,
center: new google.maps.LatLng(52.5498783, 13.425209099999961),
mapTypeId: google.maps.MapTypeId.ROADMAP,
scrollwheel: true
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
let image = {
url: 'https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png',
size: new google.maps.Size(54, 86),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(27, 86),
};
let marker = new google.maps.Marker({
map: map,
position: map.getCenter(),
icon: image
});
let infowindow = new google.maps.InfoWindow({
content: 'Hello from Marker'
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
$('<div/>').addClass('centerMarker').appendTo(map.getDiv());
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(marker.getPosition());
});
google.maps.event.addListener(map, 'dragstart', function() {
infowindow.close();
marker.setVisible(false);
$('.centerMarker').show();
});
google.maps.event.addListener(map, 'dragend', function() {
marker.setPosition(map.getCenter());
marker.setVisible(true);
$('.centerMarker').hide();
});
}
#map-canvas {
height: 400px;
}
#map-canvas .centerMarker {
position: absolute;
background: url(https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png) no-repeat;
top: 50%;
left: 50%;
z-index: 1;
margin-left: -27px;
margin-top: -86px;
height: 86px;
width: 54px;
cursor: pointer;
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="map-canvas"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initialize">
</script>
我在 Google 地图的中心添加了一个固定标记:
css 对于 div:
.centerMarker{
width:30px;
height:60px;
margin:auto;
position:absolute;
top:50%;
left:50%;
z-index:2;
background:url('fixedMarker.png') no-repeat center;
background-size:30px 60px;
margin-top:-60px;
margin-left:-15px;
}
将 div 添加到地图的脚本:
$('<div/>').addClass('centerMarker').appendTo(map.getDiv())
这会导致滚动(用于缩放)在附加的 div 上不起作用(但在地图的其他部分上起作用)。如何让滚动事件通过 div 到达地图?
编辑: 我需要这个 div 可以点击。所以我不应该禁用此 div.
上的所有事件由于 Google 地图 iframe 仅在按下 ctrl
时才起作用,您可以使用 JQuery 事件使 centerMarker
在 ctrl
时对事件不敏感]被按下,像这样:
$("window").keydown((e) => {
if (e.keyCode == 17) {
$(".centerMarker").css("pointer-events", "none");
}
});
$("window").keyup((e) => {
if (e.keyCode == 17) {
$(".centerMarker").css("pointer-events", "all");
}
});
#parent {
position: relative;
}
.centerMarker {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parent"><iframe width="700" height="440" src="https://maps.google.com/maps?width=700&height=440&hl=en&q=Paris%2C%20France+(Titre)&ie=UTF8&t=&z=10&iwloc=B&output=embed" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
<div class="centerMarker">
test
</div>
</div><br />
我真的不明白你为什么需要它,而且你还没有提供完整的代码和用例。
您可以做的是:按照我的建议使用标准标记,然后在 dragstart
上隐藏标记并显示您的自定义绝对元素。在 dragend
上隐藏元素,重新定位标记并再次显示它。这样您就可以保持本机标记行为,并且在拖动时不会看到延迟。
如果你想像你的问题建议的那样使用滚轮缩放,那么你就会遇到问题。滚轮缩放将地图缩放到鼠标光标所在的位置(而不是朝向地图中心),这意味着缩放后,您的标记将不再位于中心。所以在这种情况下,您需要在缩放后重新居中地图。我使用了以下内容:
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(marker.getPosition());
});
如果您不这样做,那么您的绝对定位标记将不再位于您真正的标记所在的位置...
这是一个有效的代码片段。请注意,如果使用信息窗口,您还会遇到一些问题。如果标记距离 canvas 边缘太近,Infowindows 可能会导致地图重新定位(例如,如果您将地图高度设置为 150px...,就会发生这种情况)。您可能还需要在拖动地图时将其隐藏,否则它会停留在同一位置。
换句话说,这听起来像是 "just" 在拖动地图和重新定位标记时看不到一点延迟的很多 hack... IMO
function initialize() {
var mapOptions = {
zoom: 14,
center: new google.maps.LatLng(52.5498783, 13.425209099999961),
mapTypeId: google.maps.MapTypeId.ROADMAP,
scrollwheel: true
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
let image = {
url: 'https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png',
size: new google.maps.Size(54, 86),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(27, 86),
};
let marker = new google.maps.Marker({
map: map,
position: map.getCenter(),
icon: image
});
let infowindow = new google.maps.InfoWindow({
content: 'Hello from Marker'
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
$('<div/>').addClass('centerMarker').appendTo(map.getDiv());
google.maps.event.addListener(map, 'idle', function() {
map.setCenter(marker.getPosition());
});
google.maps.event.addListener(map, 'dragstart', function() {
infowindow.close();
marker.setVisible(false);
$('.centerMarker').show();
});
google.maps.event.addListener(map, 'dragend', function() {
marker.setPosition(map.getCenter());
marker.setVisible(true);
$('.centerMarker').hide();
});
}
#map-canvas {
height: 400px;
}
#map-canvas .centerMarker {
position: absolute;
background: url(https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png) no-repeat;
top: 50%;
left: 50%;
z-index: 1;
margin-left: -27px;
margin-top: -86px;
height: 86px;
width: 54px;
cursor: pointer;
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="map-canvas"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initialize">
</script>