Google MAP API UnEught TypeError: Tidak dapat membaca properti 'offsetWidth' dari nol

204

Saya mencoba menggunakan Google MAP API v3 dengan kode berikut.

<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>

Ketika saya menjalankan kode ini, browser mengatakan ini.

UnEught TypeError: Tidak dapat membaca properti 'offsetWidth' dari nol

Saya tidak tahu, karena saya mengikuti arahan yang diberikan dalam tutorial ini .

Apakah Anda punya petunjuk?

Jaeyong
sumber

Jawaban:

317

Masalah ini biasanya karena div peta tidak dirender sebelum javascript berjalan yang perlu mengaksesnya.

Anda harus meletakkan kode inisialisasi Anda di dalam fungsi onload atau di bagian bawah file HTML Anda, tepat sebelum tag, sehingga DOM sepenuhnya ditampilkan sebelum dijalankan (perhatikan bahwa opsi kedua lebih sensitif terhadap HTML yang tidak valid).

Catatan, seperti yang ditunjukkan oleh matthewsheets, ini juga bisa disebabkan oleh div dengan id yang tidak ada sama sekali dalam HTML Anda (kasus patologis dari div tidak dirender)

Menambahkan contoh kode dari posting wf9a5m75 untuk meletakkan semuanya di satu tempat:

<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
sumber
7
Ini terjadi pada saya sepanjang waktu ketika saya lupa untuk mengkondisikan skrip peta saya. Menambahkan: var mapExists = document.getElementById ("map-canvas"); if (mapExists) {// script} membuat semuanya lebih baik.
Imperatif
109

Untuk orang lain yang mungkin masih memiliki masalah ini , bahkan setelah mencoba rekomendasi di atas, menggunakan pemilih yang salah untuk kanvas peta Anda pada fungsi inisialisasi dapat menyebabkan masalah yang sama karena fungsi ini mencoba mengakses sesuatu yang tidak ada. Periksa ulang apakah Id peta Anda cocok dengan fungsi inisialisasi Anda dan HTML Anda atau kesalahan yang sama ini dapat terjadi.

Dengan kata lain, pastikan ID Anda cocok. ;)

matthewsheets
sumber
3
Luar biasa bagaimana Anda bisa begitu yakin ini bukan masalah ... sampai Anda mengecek dan menyadari bahwa Anda mengubahnya pengujian sebelumnya dan lupa untuk mengubahnya kembali. :-)
Charlie Gorichanaz
28

Anda juga bisa mendapatkan kesalahan ini jika Anda tidak menentukan centeratau zoomdalam opsi peta Anda.

JamesFrost
sumber
2
Itu dia! Zoom yang dihapus dari opsi karena saya mengaturnya nanti dalam skrip, dan boom, peta akan memuat pertama kali, tetapi yang kedua kali akan menghasilkan kesalahan itu. Terima kasih!!
Iain Grant
Yup, ini milikku! Punya zoom tetapi tidak ada pusat. Hanya menambahkan pusat memperbaikinya.
Whelkaholism
1
Setidaknya mereka bisa mencatat beberapa pesan di konsol. Terima kasih!
Martin Shishkov
26

Google menggunakan id="map_canvas"dan id="map-canvas"dalam sampel, periksa ulang dan periksa ulang id: D

dpineda
sumber
23

Tahun, jawaban geocodezip benar. Jadi ubah kode Anda seperti ini: (jika Anda masih dalam kesulitan, atau mungkin orang lain di masa depan)

<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
sumber
Tepatnya, pertama-tama render div html dan kemudian JS lain menambahkan pendengar acara.
foxybagga
11

Jadi saya menambahkan skenario gagal saya agar ini berfungsi. Saya punya <div id="map>di mana saya memuat peta dengan:

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

dan div pada awalnya disembunyikan dan tidak secara eksplisit mengatur lebar dan tinggi nilai jadi itu ukurannya width x 0. Setelah saya mengatur ukuran div ini di CSS seperti ini

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

semuanya bekerja! Semoga ini bisa membantu seseorang.

Nikola
sumber
Inilah alasan mengapa itu tidak berhasil untuk saya. Anda perlu memastikan CSS cocok dengan id peta Anda dan Anda memiliki semacam kombo lebar / tinggi awal jika tidak tidak ada yang ditampilkan. Jadi untuk rekap: 1. pastikan html div id Anda cocok dengan pemilih id ketika Anda memanggil getElementById di JavaScript Anda 2. pastikan CSS memiliki kode untuk gaya peta khusus Anda misalnya # map1 {width: 200px; tinggi: 200px; } atau serupa sehingga membuatnya.
Tahir Khalid
7

Untuk lebih banyak lagi orang lain yang mungkin masih mengalami masalah ini, saya menggunakan <div id="map1" />tag yang menutup sendiri , dan div kedua tidak muncul, dan tampaknya tidak berada di dom. segera setelah saya mengubahnya menjadi dua tag buka & tutup <div id="map1"></div>itu berfungsi. hth

changokun
sumber
6

Juga berhati-hatilah untuk tidak menulis

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

benar:

google.maps.event.addDomListener(window, "load", init)
Mike
sumber
Memang. Itu juga merupakan masalah dalam kasus saya. Yang pertama menjalankan fungsi init segera ketika yang kedua hanya melewati fungsi init sebagai parameter untuk pendengar acara yang akan menjalankan fungsi init ketika peristiwa itu terjadi. stackoverflow.com/questions/13286233/…
kivikall
6

Saya punya satu kutipan di blog saya

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

dan menggantinya dengan tanda kutip ganda

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

Ini berhasil bagi saya.

Pemrogram VB.Net
sumber
5

Mengubah ID (di semua 3 tempat) dari "map-canvas" ke "map" memperbaikinya untuk saya, meskipun saya telah memastikan ID-nya sama, div memiliki lebar dan tinggi, dan kode tidak berjalan sampai setelah jendela memuat panggilan. Itu bukan tanda hubung; tampaknya tidak berfungsi dengan ID selain "peta".

Johnny5k
sumber
4

Juga, pastikan Anda tidak menempatkan simbol hash (#) di dalam pemilih Anda di a

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

    document.getElementById('map') // good

pernyataan. Itu bukan jQuery. Hanya pengingat cepat untuk seseorang yang sedang terburu-buru.

Keeprock
sumber
3

Saya memiliki masalah yang sama tetapi masalahnya adalah bahwa zoom tidak didefinisikan dalam objek opsi yang diberikan ke Google Maps.

torresomar
sumber
2

Jika Anda membuat beberapa peta dalam satu lingkaran, jika elemen DOM peta tunggal tidak ada, itu akan merusak semuanya. Pertama, periksa untuk memastikan elemen DOM ada sebelum membuat objek Peta baru.

[...]

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

[...]
Zack Katz
sumber
1
Tapi yang harus dilakukan adalah menghentikan peta yang sedang dibuat, tidak benar-benar memperbaiki kekacauan dan membuat peta.
Ryan The Leach
1

Jika Anda menggunakan asp.net Webforms dan mendaftarkan skrip dalam kode di belakang halaman menggunakan halaman master, jangan lupa untuk menggunakan clientID elemen peta (vb.net):

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

Untuk mengatasinya Anda perlu menambahkan async defer ke skrip.

Seharusnya seperti ini:

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

Lihat di sini arti dari async defer.

Karena Anda akan memanggil fungsi dari file js utama, Anda juga ingin memastikan bahwa ini setelah fungsi tempat Anda memuat skrip utama.

Avi Levin
sumber
1

Pastikan Anda menyertakan perpustakaan Places &libraries=places parameter saat pertama kali memuat API.

Sebagai contoh:

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

Saya tahu saya agak terlambat ke pesta, hanya ingin menambahkan bahwa kesalahan juga bisa terjadi ketika div tidak ada di halaman. Anda juga dapat memeriksa apakah div ada terlebih dahulu sebelum memuat panggilan fungsi google maps. Sesuatu seperti

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
sumber
1
  • Setup ng-init = init () di HTML Anda
  • Dan di controller

    gunakan $ scope.init = function () {...} alih-alih google.maps.event.addDomListener (window, "load", init) {...}

Semoga ini bisa membantu Anda.

Akash Saxena
sumber
0

Sebenarnya cara termudah untuk memperbaikinya adalah dengan memindahkan objek Anda sebelum kode Javascript berhasil. Saya kira objek jawaban Anda dimuat setelah kode 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
sumber
0

Dalam kasus saya, masalah semacam ini diselesaikan menggunakan defer https://developer.mozilla.org/en/docs/Web/HTML/Element/script

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

Anda perlu mempertimbangkan dukungan peramban akun untuk opsi ini (saya belum melihat masalah)

Yercalamarino
sumber
0

Pastikan Anda tidak mengesampingkan window.self

Masalah saya: Saya telah membuat komponen dan menulis self = thisalih-alih var self = this. Jika Anda tidak menggunakan kata kunci var, JS akan meletakkan variabel itu di objek jendela, jadi saya menimpa window.selfyang menyebabkan kesalahan ini.

Mike R Emo
sumber
0

Ini adalah pengeditan pos yang sebelumnya dihapus untuk memuat konten dari jawaban yang ditautkan, dalam jawaban itu sendiri. Tujuan untuk menerbitkan kembali jawaban ini adalah berfungsi sebagai PSA untuk pengguna 0.9+ React yang juga tersandung ke dalam masalah ini.

pos yang diedit asli


Juga mendapat kesalahan ini saat menggunakan ReactJS saat mengikuti posting blog ini . Komentar sahat di sini membantu - lihat isi komentar sahat di bawah.

❗️ Catatan untuk Bereaksi> = 0,9

Sebelum v0.9, node DOM diteruskan sebagai argumen terakhir. Jika Anda menggunakan ini, Anda masih dapat mengakses simpul DOM dengan memanggil this.getDOMNode ().

Dengan kata lain, ganti parameter rootNode dengan this.getDOMNode () di React versi terbaru.

Meredith
sumber
0

Kegagalan saya adalah untuk digunakan

zoomLevel

sebagai opsi, bukan opsi yang benar

zoom
Strattonn
sumber
0

tambahkan penangguhan async pada awal panggilan kunci api peta.

Ghadir Farzaneh
sumber
0

Dalam kasus yang saya hadapi, div peta dibuat secara kondisional tergantung jika lokasi diumumkan kepada publik. Jika Anda tidak yakin apakah kanvas div peta akan ada di halaman, cukup periksa apakah Anda document.getElementByIdmengembalikan elemen dan hanya memohon peta jika ada:

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

Di sini masalahnya adalah tautan API tanpa keyparam:

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

Cara itu berfungsi dengan baik.

vati
sumber