Ошибка API Google MAP: ошибка типа: невозможно прочитать свойство offsetWidth, равное нулю


204

Я пытаюсь использовать Google MAP API v3 со следующим кодом.

<h2>Topology</h2>

<script src="https://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>

<link rel="stylesheet" type="text/css" href="{% url css_media 'tooltip.topology.css' %}" />
<link rel="stylesheet" type="text/css" href="{% url css_media 'tooltip.css' %}" />

<style type="text/css" >
      #map_canvas {
              width:300px;
            height:300px;
     }
</style>

<script type="text/javascript">

var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
            myOptions);

</script>

<div id="map_canvas"> </div>

Когда я запускаю этот код, браузер говорит это.

Uncaught TypeError: Невозможно прочитать свойство 'offsetWidth' из null

Я понятия не имею, так как я следую указаниям, данным в этом уроке .

Есть ли у вас какие-либо подсказки?

Ответы:


317

Эта проблема обычно происходит из-за того, что div карты не отображается перед запуском javascript, который должен получить к нему доступ.

Вы должны поместить свой код инициализации в функцию onload или внизу вашего HTML-файла, непосредственно перед тегом, чтобы DOM полностью отображался перед выполнением (обратите внимание, что второй параметр более чувствителен к недопустимому HTML).

Обратите внимание, что, как указано в Matthewsheets, это также может быть вызвано тем, что div с таким идентификатором вообще не существует в вашем HTML (патологический случай, когда div не отображается)

Добавим пример кода из поста wf9a5m75 , чтобы все было в одном месте:

<script type="text/javascript">

function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
            myOptions);
}
google.maps.event.addDomListener(window, "load", initialize);

</script>

7
Это происходит со мной все время, когда я забываю обусловить сценарий своих карт. Добавление: var mapExists = document.getElementById ("map-canvas"); if (mapExists) {// script} делает все это лучше.
императив

109

Для других, которые все еще могут иметь эту проблему , даже после попытки вышеупомянутых рекомендаций, использование неправильного селектора для вашего холста карты в функции инициализации может вызвать ту же самую проблему, поскольку функция пытается получить доступ к чему-то, что не существует. Дважды проверьте, что идентификатор вашей карты совпадает в вашей функции инициализации, и ваш HTML или эта же ошибка могут быть выброшены.

Другими словами, убедитесь, что ваши идентификаторы совпадают. ;)


3
Удивительно, как вы можете быть уверены, что это не проблема ... пока вы не перепроверите и не поймете, что изменили его ранее во время тестирования и забыли вернуть обратно. :-)
Чарли Горичаназ

28

Вы также можете получить эту ошибку, если вы не указали centerили zoomв опциях вашей карты.


2
Это был один! Убрал масштабирование из опций, так как я все равно устанавливал его позже в скрипте, и boom, карта будет загружаться в первый раз, но второй раз вызовет эту ошибку. Спасибо!!
Иан Грант

Да, это был мой! Был зум, но нет центра. Просто добавив центр исправил это.
Whelkaholism

1
По крайней мере, они могли записать какое-то сообщение в консоли. Спасибо!
Мартин Шишков

26

Google использует id="map_canvas"и id="map-canvas"в примерах, дважды проверьте и еще раз проверьте идентификатор: D


23

Год, геокодезип ответ правильный. Поэтому измените свой код следующим образом: (если у вас все еще проблемы, или, возможно, кто-то еще в будущем)

<script type="text/javascript">

function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
        zoom: 8,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
            myOptions);
}
google.maps.event.addDomListener(window, "load", initialize);

</script>

Точно, сначала визуализируйте html div, а затем JS еще добавьте прослушиватель событий.
foxybagga

11

Просто я добавляю свой сценарий сбоя, чтобы заставить это работать. У меня был файл, <div id="map>в который я загружал карту:

var map = new google.maps.Map(document.getElementById("map"), myOptions);

и div изначально был скрыт, и у него не было явных значений ширины и высоты, поэтому его размер был width x 0. Как только я установил размер этого div в CSS следующим образом

#map {
    width: 500px;
    height: 300px;
}

все работало! Надеюсь, это кому-нибудь поможет.


Это была причина, почему это не сработало для меня. Вы должны убедиться, что CSS соответствует вашему идентификатору карты и что у вас есть какая-то начальная комбинация ширина / высота, иначе ничего не отображается. Напомним: 1. убедитесь, что ваш html div id соответствует селектору идентификаторов, когда вы вызываете getElementById в вашем JavaScript 2. убедитесь, что CSS имеет код для стилизации вашей конкретной карты, например # map1 {width: 200px; высота: 200 пикселей; } или подобный, так что это делает.
Тахир Халид

7

Для еще большего количества других, у которых все еще может быть эта проблема, я использовал самозакрывающийся <div id="map1" />тег, а второй div не показывался и, похоже, не находился в DOM. как только я изменил его на два тега open & close, <div id="map1"></div>он заработал. НТН


6

Также будьте осторожны, чтобы не писать

google.maps.event.addDomListener(window, "load", init())

верный:

google.maps.event.addDomListener(window, "load", init)

На самом деле. Это было проблемой и в моем случае. Первый сразу запускает функцию init, когда второй просто передает функцию init в качестве параметра слушателю событий, который будет запускать функцию init при возникновении этого события. stackoverflow.com/questions/13286233/…
kivikall

6

У меня были одинарные кавычки в моем

var map = new google.maps.Map( document.getElementById('map_canvas') );

и заменил их двойными кавычками

var map = new google.maps.Map( document.getElementById("map_canvas") );

Это помогло мне.


5

Изменение идентификатора (во всех 3 местах) с «map-canvas» на «map» исправило это для меня, хотя я убедился, что идентификаторы одинаковые, div имеет ширину и высоту, а код не работает до окончания загрузки окна вызова. Это не черта; похоже, он не работает с любым другим идентификатором, кроме «карты».


4

Кроме того, убедитесь, что вы не размещаете хеш-символ (#) внутри селектора в

    document.getElementById('#map') // bad

    document.getElementById('map') // good

заявление. Это не jQuery. Просто быстрое напоминание для спешащего.


3

У меня была та же проблема, но проблема заключалась в том, что масштабирование не было определено в объекте параметров, заданном для Google Maps.


2

Если вы создаете несколько карт в цикле, если один элемент DOM карты не существует, он нарушает их все. Сначала убедитесь, что элемент DOM существует, прежде чем создавать новый объект Map.

[...]

for( var i = 0; i <= self.multiple_maps; i++ ) {

  var map_element = document.getElementById( 'map' + '-' + i.toString() );

  // Element doesn't exist, don't create map!
  if( null === map_element ) {
    continue;
  }

  var map = new google.maps.Map( map_element, myOptions);
}

[...]

1
Но все, что делает, это останавливает создание карты, а не исправляет беспорядок и создает карту.
Райан Лич

1

Если вы используете веб-формы asp.net и регистрируете скрипт в коде страницы, используя главную страницу, не забудьте использовать clientID элемента карты (vb.net):

ClientScript.RegisterStartupScript(Me.[GetType](), "Google Maps Initialization", String.Format("init_map(""" & map_canvas.ClientID() & """...

1

Для ее решения необходимо добавить async deferв скрипт.

Должно быть так:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    async defer></script>

Смотрите здесь значение асинхронного отсрочки.

Так как вы будете вызывать функцию из основного файла js, вы также должны убедиться, что это после того, где вы загружаете основной скрипт.


1

Убедитесь, что вы включили библиотеку Places &libraries=places параметр при первой загрузке API.

Например:

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">

1

Я знаю, что немного опоздал на вечеринку, просто хотел добавить, что ошибка также может произойти, когда div не существует на странице. Вы также можете проверить, существует ли div в первую очередь перед загрузкой вызова функции Google Maps. Что-то вроде

function initMap() {
    if($("#venuemap").length != 0) {
        var city= {lat: -26.2041, lng: 28.0473};
        var map = new google.maps.Map(document.getElementById('venuemap'), {
       etc etc
     }
}

1
  • Настройте ng-init = init () в вашем HTML
  • И в контроллере

    используйте $ scope.init = function () {...} вместо google.maps.event.addDomListener (window, "load", init) {...}

Надеюсь, что это поможет вам.


0

На самом деле самый простой способ исправить это - просто переместить ваш объект до того, как код Javascript сработал для меня. Я думаю, в вашем ответе объект загружается после кода JavaScript.

<style type="text/css" >
      #map_canvas {
              width:300px;
            height:300px;
     }

 <div id="map_canvas"> </div> // Here 

<script type="text/javascript">

var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"),
            myOptions);

</script>

<div id="map_canvas"> </div>


0

Проверьте, что вы не переопределяете window.self

Моя проблема: я создал компонент и написал self = thisвместо var self = this. Если вы не используете ключевое слово var, JS поместит эту переменную в объект окна, поэтому я переписал, window.selfчто вызвало эту ошибку.


0

Это редактирование ранее удаленного сообщения, в котором содержится содержание связанного ответа в самом ответе. Целью повторной публикации этого ответа является функционирование в качестве PSA для пользователей React 0.9+, которые также столкнулись с этой проблемой.

оригинальное отредактированное сообщение


Также получил эту ошибку при использовании ReactJS, следуя этому сообщению в блоге . Здесь помог комментарий сахата - см. содержание комментария сахата ниже.

❗️ Примечание для реакции> = 0,9

До v0.9 узел DOM передавался как последний аргумент. Если вы использовали это, вы все равно можете получить доступ к узлу DOM, вызвав this.getDOMNode ().

Другими словами, замените параметр rootNode на this.getDOMNode () в последней версии React.


0

Моя ошибка была в использовании

zoomLevel

как вариант, а не правильный вариант

zoom


0

В случае, с которым я имел дело, карта div была условно визуализирована в зависимости от того, было ли местоположение опубликовано. Если вы не можете быть уверены, будет ли div страницы холста карты на странице, просто проверьте, что ваш document.getElementByIdэлемент возвращает, и вызывайте карту, только если она присутствует:

var mapEle = document.getElementById("map_canvas");
if (mapEle) {
    map = new google.maps.Map(mapEle, myOptions);
}

-2

Здесь проблема заключалась в ссылке API без keyпараметра:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?libraries=places&key=YOURKEY"></script>

Этот способ отлично работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.