it-swarm.com.ru

InvalidValueError: не экземпляр HTMLInputElement

К вашему сведению, я не ниндзя из JavaScript, но мне показалось, что я стану им, когда в последнее время много чего делал на основе Google Maps.

Я реализовал карту. Пользователь может искать в Google местах и ​​разместить маркер для него. для этого есть текстовое поле. Или пользователь может щелкнуть карту, чтобы поместить маркер в нужное место, или перетащить маркер.

Код остается прежним. Дизайн изменился. Идентификатор и имя поля ввода также совпадают. Без изменений в коде JS. Но эта вещь не работает.

Вот сайт

Карта Google выдает ошибку.

 InvalidValueError: not an instance of HTMLInputElement

Я попытался решение, данное здесь Но ошибка все еще остается.

В чем может быть причина?

Вот код:

        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>

Google Map

<div id="source_map"></div>
21
Sajeev C

Ваше поле TEXTAREA, и из последних обновлений автозаполнение карт Google теперь поддерживает только window.HTMLInputElement (INPUT tag)

:-(

42
jb4

Это было моей проблемой, когда я следовал учебнику в Google . Проблема в том, что вы должны выполнить javascript после загрузки страницы, вы можете вызвать функцию с параметром GET при вызове скрипта Google Map:

<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();

Теперь внутри этой функции вы можете выполнять свои функции API Карт Google, такие как document.getElementById('source_map'), и все методы, принадлежащие классу google.

7
707

Это проблема DOM. Ваш JavaScript загружается перед загрузкой вашего HTML-документа.

Убедитесь, что ваши HTML-элементы загружаются в первую очередь, а затем только Javascript.

Подобно

а потом

6
Prashant Kumar Mishra

У меня была такая же проблема в Angular2. Мое решение состоит в том, чтобы переместить инициализацию Google Maps в функцию, которая срабатывает, когда пользователь фокусируется в поле автозаполнения 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>
3
Vingtoft

Я столкнулся с той же проблемой несколько дней назад, но я нашел решение, если кому-то интересно :) Это не идеально, это очень сложно, но это делает 95% работы! Я знаю, что это очень старая тема, но если это может спасти кого-то ...

Идея состоит в том, чтобы добавить пользовательскую текстовую область и связать исходное значение входного текста с текстовой областью (с событиями keyup, keypress, keydown, change).

$('.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; 
}

Это далеко не идеально, и я открыт, если у кого-то есть лучшее решение!

1
KCarnaille

Для угловых

Я инициализировал autocomplete в ngOnInit(), из-за которого я получал ошибку .. Я просто переместил инициализацию в ngAfterViewInit(), и все работало нормально.

Код:

  ngAfterViewInit(): void {
    this.autocomplete = new google.maps.places.Autocomplete(
      (this._document.getElementById('input')),
      { types: ['geocode'] }
    );
  }
0
Anand Undavia

.pac-container { z-индекс: 1051! важно; }

0
swapnil kambe