InvalidValueError:不是HTMLInputElement的实例

时间:2015-12-03 10:26:08

标签: javascript google-maps google-maps-api-3 google-maps-markers google-places-api

仅供参考,我不是一名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>

10 个答案:

答案 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脚本异步执行,而页面的其余部分继续解析。解决方法:

  1. 在相关HTML元素(如Prashant指出的之后,之后放置Google Maps脚本)
  2. 使用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
    };