仅供参考,我不是一名JavaScript忍者,但感觉我最近会在Google Maps上做很多事情时成为一名。
我实施了一张地图。用户可以搜索谷歌地点并为其添加标记。有一个文本框。或者,用户可以单击地图将标记放置到他要查找的位置,或拖动标记。
代码保持不变。设计改变了。输入字段的ID和名称也相同。没有改变JS代码。但是这件事没有用。
这是website
Google地图正在产生错误。
InvalidValueError: not an instance of HTMLInputElement
我尝试了here给出的解决方案 但错误仍然存在。
可能的原因是什么?
以下是代码:
var map;
var marker;
var latLngC;
function initialize()
{
latLngC = new google.maps.LatLng(14.5800, 121.0000);
var mapOptions = {
center: latLngC,
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP,
};
map = new google.maps.Map(document.getElementById('source_map'),
mapOptions);
var marker = new google.maps.Marker({
position: latLngC,
map: map,
draggable: true
});
google.maps.event.addListener(marker, 'dragend', function (x)
{
document.getElementById('src_lat').value = x.latLng.lat();
document.getElementById('src_long').value = x.latLng.lng();
document.getElementById('pickup_location').innerHTML = x.latLng.lat()+' , '+x.latLng.lng();
var geocoder = new google.maps.Geocoder;
var infowindow = new google.maps.InfoWindow;
geocodeLatLng(geocoder, map, infowindow,x.latLng.lat(),x.latLng.lng(),'source_point');
});
//Get coordinates,address Upon clicking a location in map (Source Map)
//By Sajeev
google.maps.event.addListener(map, 'click', function(x)
{
document.getElementById('src_lat').value = x.latLng.lat();
document.getElementById('src_long').value = x.latLng.lng();
document.getElementById('pickup_location').innerHTML = x.latLng.lat()+' , '+x.latLng.lng();
var geocoder = new google.maps.Geocoder;
var infowindow = new google.maps.InfoWindow;
geocodeLatLng(geocoder, map, infowindow,x.latLng.lat(),x.latLng.lng(),'source_point');
});
//Add marker upon clicking on map
//google.maps.event.addDomListener(map, 'click', addMarker);
google.maps.event.addDomListener(map, 'click', function() { addMarker(map); });
var places1 = new google.maps.places.Autocomplete(document.getElementById('source_point'));
google.maps.event.addListener(places1, 'place_changed', function () {
var place1 = places1.getPlace();
var src_addr = place1.formatted_address;
var src_lat = place1.geometry.location.lat();
var src_long = place1.geometry.location.lng();
var mesg1 = "Address: " + src_addr;
mesg1 += "\nLatitude: " + src_lat;
mesg1 += "\nLongitude: " + src_long;
//alert(mesg1);
document.getElementById('src_lat').value = src_lat;
document.getElementById('src_long').value = src_long;
document.getElementById('pickup_location').innerHTML = src_lat+' , '+src_long;
});
//Add marker upon place change
//google.maps.event.addDomListener(places1, 'place_changed', addMarker);
google.maps.event.addDomListener(places1, 'place_changed', function() { addMarker(map); });
}
google.maps.event.addDomListener(window,'resize',initialize);
google.maps.event.addDomListener(window, 'load', initialize);
我的HTML代码如下所示:
<form role="form" id="frm_source" name="frm_source" method="POST" action="index_action.php">
<div class="form-group">
<label for="source_point"><h2>Pickup Address</h2></label>
<textarea type="text" id="source_point" name="source_point" class="form-control" placeholder="Enter your pick up address here"></textarea>
</div>
<div class="form-group">
<label for="pickup_location"><h3>GPS Cordinates</h3></label>
<hr>
<p id="pickup_location"></p>
</div>
<div class="form-group">
<input type="hidden" id="src_lat" name="src_lat" placeholder="latitude" >
<input type="hidden" id="src_long" name="src_long" placeholder="longitude" >
</div>
<input type="submit" name="submit" id="submit" class="btn btn-primary" value="Next to enter destination address" />
</form>
谷歌地图
<div id="source_map"></div>
答案 0 :(得分:43)
您的字段为TEXTAREA
,从上次更新开始,Google地图自动填充功能现在仅支持window.HTMLInputElement (INPUT tag)
: - (
答案 1 :(得分:7)
在按照Google上的教程进行操作时,这是我的问题。
问题是您应该在页面加载后执行javascript,您可以在调用Google Map脚本时调用GET
参数上的函数:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places$callback=YourFunctionHere"></script>
YourFunctionHere
是一个回调函数,意味着它只会在页面加载后执行。
或者你可以在页面加载后调用函数。示例:window.onload = Yourfunction();
现在,在该功能中,您可以使用document.getElementById('source_map')
等Google地图API和属于google
类的所有方法。
答案 2 :(得分:6)
这是DOM的问题。在加载html文档之前加载了javascript。
确保首先加载html元素,然后只加载javascript。
像
然后
你的javascript代码答案 3 :(得分:3)
我在Angular2中遇到了同样的问题。我的解决方案是将Google地图的初始化移动到当用户关注自动填充input
字段时触发的功能。不是最美丽的解决方案,但它确实有效。
代码:
private autocomplete_init: boolean: false;
autocompleteFocus() {
this.autocomplete_init = true;
if (!this.autocomplete_init) {
this._autocomplete = new google.maps.places.Autocomplete(document.getElementById("search_address"), {
componentRestrictions: {'country': 'dk'}
}
}
HTML:
<input placeholder="Search" type="text" id="search_address" (focus)="autocompleteFocus()" autofocus>
答案 4 :(得分:1)
几天前我也遇到过同样的问题,但是如果有人感兴趣,我已经找到了解决方案:)它并不完美,非常有点棘手,但是可以完成95%的工作!我知道这是一个非常古老的话题,但是如果它可以拯救某人……
这个想法是添加一个自定义文本区域,并将原始输入文本值绑定到文本区域(包括按键,按键,击键,更改事件)。
$('.MyInput').on('keyup keydown keypress change', function() {
$('myTextarea').val($(this).val());
emptyPlaceholder($(this), 'Myplaceholder text');
});
function emptyPlaceholder(input, placeholder) {
// The placeholder of the textarea will hide if the input has a value
if (input.val().length) {
$('#triggerInput').attr('placeholder', '');
} else {
$('#triggerInput').attr('placeholder', placeholder);
}
}
添加一些CSS以“隐藏”原始输入。它会隐藏您在输入中编写的内容,然后您只会看到在文本区域中编写的内容(重要提示:输入的z索引必须优于文本区域!)
.MyInput {
color: transparent;
background-color: transparent;
}
这远非完美,如果有人有更好的解决方案,我很乐意!
答案 5 :(得分:0)
.pac-container { z-index:1051!important; }
答案 6 :(得分:0)
对于Angular
我正在初始化autocomplete
中的ngOnInit()
,因此出现错误。
我只是将初始化移至ngAfterViewInit()
,一切正常。
代码:
ngAfterViewInit(): void {
this.autocomplete = new google.maps.places.Autocomplete(
(this._document.getElementById('input')),
{ types: ['geocode'] }
);
}
答案 7 :(得分:0)
在遵循Google教程的过程中发生了同样的问题。以我为例,问题出在async
关键字上,这导致Google Maps脚本异步执行,而页面的其余部分继续解析。解决方法:
defer
关键字而不是 async
关键字调用Google Maps脚本。代码:<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places$callback=YourFunctionHere" defer></script>
使用defer
可以确保在页面完成解析(source)后执行脚本。
答案 8 :(得分:0)
就我而言,错误的原因是 google.maps.ControlPosition 运行了不止一次。我的谷歌地图以模式显示。在我第一次打开模态时,一切正常,但下次出现此错误。 我的解决方案:只初始化一次地图。
constructor(props) {
super(props);
this.state = {
lat: null,
lng: null,
visible: false,
inited: false
};
this.initMap = this.initMap.bind(this);
this.setModalVisible = this.setModalVisible.bind(this);
}
setModalVisible(status) {
if (!this.state.inited) {
//Khi chưa init map lần nào (chưa từng mở modal)
this.setState(
{
visible: true,
inited: true
},
() => {
this.initMap();
}
);
} else {
// Khi đã init, đóng/mở modal mà k cần init lại
this.setState({
visible: status
});
}
}
initMap() {
if (this.state.visible) {
let map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 21.0277644, lng: 105.8341598 },
zoom: 10
});
const card = document.getElementById("pac-card");
const input = document.getElementById("pac-input");
const options = {
fields: ["formatted_address", "geometry", "name"],
origin: map.getCenter(),
strictBounds: false
};
map.controls[google.maps.ControlPosition.TOP_CENTER].push(card);
const autocomplete = new google.maps.places.Autocomplete(
input,
options
);
autocomplete.bindTo("bounds", map);
const infowindow = new google.maps.InfoWindow();
const infowindowContent = document.getElementById(
"infowindow-content"
);
infowindow.setContent(infowindowContent);
var marker = new google.maps.Marker({
map
});
google.maps.event.addListener(map, "click", e => {
console.log(e);
var latLng = e.latLng;
this.setState({
lat: e.latLng.lat(),
lng: e.latLng.lng()
});
console.log(latLng.lat(), latLng.lng());
if (marker && marker.setMap) {
marker.setMap(null);
}
marker = new google.maps.Marker({
position: latLng,
map: map
});
});
autocomplete.addListener("place_changed", () => {
infowindow.close();
const place = autocomplete.getPlace();
console.log(place);
if (!place.geometry || !place.geometry.location) {
window.alert(
"Không tìm thấy vị trí " +
place.name +
" .Vui lòng chọn trên bản đồ."
);
return;
}
this.setState({
lat: place.geometry.location.lat(),
lng: place.geometry.location.lng()
});
if (marker && marker.setMap) {
marker.setMap(null);
}
marker = new google.maps.Marker({
position: place.geometry.location,
map: map
});
map.setZoom(16);
infowindowContent.children["place-name"].textContent =
place.name;
infowindowContent.children["place-address"].textContent =
place.formatted_address;
infowindow.open(map, marker);
});
}
}
答案 9 :(得分:-2)
您还有一个错误
function initialize()
{
latLngC = new google.maps.LatLng(14.5800, 121.0000);
var mapOptions = {
center: latLngC,
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP // you must remove the comme
};