Ошибка 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

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

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

jaeyong
источник

Ответы:

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

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

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

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

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

JamesFrost
источник
2
Это был один! Убрал масштабирование из опций, так как я все равно устанавливал его позже в скрипте, и boom, карта будет загружаться в первый раз, но второй раз вызовет эту ошибку. Спасибо!!
Иан Грант
Да, это был мой! Был зум, но нет центра. Просто добавив центр исправил это.
Whelkaholism
1
По крайней мере, они могли записать какое-то сообщение в консоли. Спасибо!
Мартин Шишков
26

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

dpineda
источник
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>
wf9a5m75
источник
Точно, сначала визуализируйте 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>он заработал. НТН

changokun
источник
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") );

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

Программист VB.Net
источник
5

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

Johnny5k
источник
4

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

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

    document.getElementById('map') // good

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

Keeprock
источник
3

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

torresomar
источник
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
     }
}
mr_j
источник
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>
Laltzi
источник
0

В моем случае такого рода проблемы были решены с использованием defer https://developer.mozilla.org/en/docs/Web/HTML/Element/script

<script src="<your file>.js" defer></script>

Вы должны принять во внимание поддержку этой опции браузерами (проблем не возникало)

Yercalamarino
источник
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
strattonn
источник
0

добавить асинхронную отсрочку в начале вызова карты API-ключа.

Гадир Фарзанех
источник
0

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

var mapEle = document.getElementById("map_canvas");
if (mapEle) {
    map = new google.maps.Map(mapEle, myOptions);
}
Rillus
источник
-2

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

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

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

vaati
источник