如何在google.maps.event.addListener中使用它 [英] How to use this in google.maps.event.addListener
问题描述
以下示例有效,但是当我尝试传递参数并在函数中使用this
时不起作用.
The following example works, but when I try to pass a parameter and use this
in the function does not work.
工作:
google.maps.event.addListener(markers[i], 'click', showInfoWindow);
function showInfoWindow() {
var service_marker = this;
service.getDetails({placeId: service_marker.placeResult.place_id},
function(place, status) {
if (status !== google.maps.places.PlacesServiceStatus.OK) {
return;
}
});
}
当我尝试使用以下代码传递参数service_obj
时.它不起作用,并显示错误Uncaught TypeError: Cannot read property 'place_id' of undefined
.
When I try to pass a parameter service_obj
with the following code. It does not work and the error Uncaught TypeError: Cannot read property 'place_id' of undefined
is displayed.
google.maps.event.addListener(markers[i], 'click', showInfoWindow(service_obj));
function showInfoWindow(service_obj) {
var service_marker = this;
service.getDetails({placeId: service_marker.placeResult.place_id}, //error here
function(place, status) {
if (status !== google.maps.places.PlacesServiceStatus.OK) {
return;
}
});
}
我相信this
不再引用实例markers[i]
.我对此很陌生,因此对术语错误感到抱歉.如果有人能帮助我或引导我朝正确的方向前进,那将是很棒的事情.
I believe this
is not refering to the instance markers[i]
anymore. I am fairly new to this so sorry about the terminology mistakes. If anyone could help me out or lead me in the right direction that would be fantastic.
推荐答案
在第三个参数中将参数传递给函数时,该函数将立即执行(这就是为什么this
不是您期望的原因)并且返回值用作事件处理函数.您可以使用匿名函数来允许您通过参数调用函数:
When you pass an argument to the function in the third argument, the function is executed immediately (which is why this
isn't what you expect) and the return value is used as the event handler function. You can use an anonymous function to allow you to call a function with parameters:
google.maps.event.addListener(marker, 'click', function (evt) { // the click event function is called with the "event" as an argument
showInfoWindow(evt, this, service, map, infowindow);
});
function showInfoWindow(evt, service_marker, service, map, infowindow) {
service.getDetails({
placeId: service_marker.placeResult.place_id
},
function (place, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
infowindow.setContent(place.name);
infowindow.open(map, service_marker);
} else {
infowindow.setContent("error: "+status);
infowindow.open(map,service_marker);
}
});
}
代码段:
var markers = [];
var map;
function initialize() {
var map = new google.maps.Map(
document.getElementById("map_canvas"), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(map);
service.nearbySearch({
location: map.getCenter(),
radius: 50000,
keyword: "restaurant"
}, function(results, status) {
if (status === google.maps.places.PlacesServiceStatus.OK) {
var bounds = new google.maps.LatLngBounds();
for (var i = 0; i < results.length; i++) {
var marker = createMarker(results[i], service, map, infowindow);
bounds.extend(marker.getPosition());
}
map.fitBounds(bounds);
}
});
}
function createMarker(place, service, map, infowindow) {
var placeLoc = place.geometry.location;
var marker = new google.maps.Marker({
map: map,
position: place.geometry.location
});
marker.placeResult = place;
google.maps.event.addListener(marker, 'click', function(evt) { // the click event function is called with the "event" as an argument
showInfoWindow(evt, this, service, map, infowindow);
});
return marker;
}
function showInfoWindow(evt, service_marker, service, map, infowindow) {
service.getDetails({
placeId: service_marker.placeResult.place_id
}, //error here
function(place, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
infowindow.setContent(place.name);
infowindow.open(map, service_marker);
} else {
infowindow.setContent("error: " + status);
infowindow.open(map, service_marker);
}
});
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map_canvas {
height: 100%;
width: 100%;
margin: 0px;
padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
<div id="map_canvas"></div>
这篇关于如何在google.maps.event.addListener中使用它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!