我有以下内容:https://jsfiddle.net/inkedraskal/h35dz9qd/5/
我收到错误:无法分配给只读属性'__e3_'为0
我之前有一个for循环,它在for循环之后调用了函数,但是jshint没有接受它。所以现在我正在使用Ajax,但我被卡住了。我可以在控制台中返回对象以及第一个信息框内容(请参阅控制台),然后我收到错误。
js如下:(任何提示,技巧等都会受到赞赏)
(function () {
renderGoogleMap();
function renderGoogleMap() {
var start_point = new google.maps.LatLng(0, 0);
// Creating a new map
var map = new google.maps.Map(document.getElementById("locations-map"), {
center: start_point,
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Creating a global infoWindow object that will be reused by all markers
var infoWindow = new google.maps.InfoWindow();
function setMarkerPoints(map,marker) {
var bounds = new google.maps.LatLngBounds();
// Looping through the JSON data
// Creating a closure to retain the correct data, notice how I pass the current data in the loop into the closure (marker, data)
$.ajax({
type: "GET",
url: 'https://raw.githubusercontent.com/roryheaney/jsonexample/master/locatoins.json',
dataType: "json",
success: function (data) {
console.log(data);
if (data.length !== 0) {
var latLng = new google.maps.LatLng(data.lat, data.lng);
// Creating a marker and putting it on the map
var marker = new google.maps.Marker({
position: latLng,
map: map,
title: data.title
});
$.each(data, function (marker, data) {
var windowContent = '<h3>' + data.title + '</h3>' +
'<p>' + data.description + '</p>';
console.log(windowContent);
// Attaching a click event to the current marker
infobox = new InfoBox({
content: infoWindow.setContent(windowContent),
alignBottom: true,
pixelOffset: new google.maps.Size(-160, -45)
});
google.maps.event.addListener(marker, 'click', function () {
// Open this map's infobox
infobox.open(map, marker);
infobox.setContent(windowContent);
map.panTo(marker.getPosition());
infobox.show();
});
google.maps.event.addListener(map, 'click', function () {
infobox.setMap(null);
});
});
}
},
error: function (data) {
// alert('Please refresh the page and try again');
console.log('Please refresh the page and try again');
}
});
//END MARKER DATA
// bounds.extend(marker.getPosition());
// end loop through json
map.setCenter(start_point);
map.fitBounds(bounds);
}
setMarkerPoints(map);
}
})();
答案 0 :(得分:2)
更改列表:
1.Google Maps API包含自己在加载页面后触发的事件,因此我更换了这些行:
(function () {
renderGoogleMap();
//...
})();
与
function renderGoogleMap() {
//...
}
google.maps.event.addDomListener(window, 'load', renderGoogleMap);
2.已添加标记lat / lng边界的初始化。
3.还有一些小修正。
<强> Working example 强>
代码段
function renderGoogleMap() {
var start_point = new google.maps.LatLng(0, 0);
// Creating a new map
var map = new google.maps.Map(document.getElementById("locations-map"), {
center: start_point,
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Creating a global infoWindow object that will be reused by all markers
var infoWindow = new google.maps.InfoWindow();
function setMarkerPoints(map, marker) {
var bounds = new google.maps.LatLngBounds();
$.ajax({
type: "GET",
url: 'https://raw.githubusercontent.com/roryheaney/jsonexample/master/locatoins.json',
dataType: "json",
success: function(data) {
if (data.length !== 0) {
$.each(data, function(marker, data) {
var latLng = new google.maps.LatLng(data.lat, data.lng);
bounds.extend(latLng);
// Creating a marker and putting it on the map
var marker = new google.maps.Marker({
position: latLng,
map: map,
title: data.title
});
var windowContent = '<h3>' + data.title + '</h3>' +
'<p>' + data.description + '</p>';
// Attaching a click event to the current marker
infobox = new InfoBox({
content: infoWindow.setContent(windowContent),
alignBottom: true,
pixelOffset: new google.maps.Size(-160, -45)
});
google.maps.event.addListener(marker, 'click', function() {
// Open this map's infobox
infobox.open(map, marker);
infobox.setContent(windowContent);
map.panTo(marker.getPosition());
infobox.show();
});
google.maps.event.addListener(map, 'click', function() {
infobox.setMap(null);
});
});
map.fitBounds(bounds);
}
},
error: function(data) {
console.log('Please refresh the page and try again');
}
});
//END MARKER DATA
// end loop through json
}
setMarkerPoints(map);
}
google.maps.event.addDomListener(window, 'load', renderGoogleMap);
// renderGoogleMap();
#locations-map {
display: block;
height: 500px;
}
.infoBox {
max-width: 300px;
background: #fff;
padding: 10px;
border: 1px solid red;
}
.infoBox img {
border: 1px solid yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script>
<div id="locations-map"></div>