208 votes

Google MAP API Uncaught TypeError : Impossible de lire la propriété 'offsetWidth' de null.

J'essaie d'utiliser l'API Google MAP v3 avec le code suivant.

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

Lorsque j'exécute ce code, le navigateur affiche ceci.

Erreur de Type Non Rattrapée : Impossible de lire la propriété 'offsetWidth' de null.

Je n'en ai aucune idée, puisque je suis la direction donnée dans ce tutoriel .

Avez-vous un indice ?

319voto

geocodezip Points 41746

Ce problème est généralement dû au fait que le div de la carte n'est pas rendu avant l'exécution du javascript qui doit y accéder.

Vous devriez placer votre code d'initialisation à l'intérieur d'une fonction onload ou au bas de votre fichier HTML, juste avant la balise, afin que le DOM soit complètement rendu avant son exécution (notez que la deuxième option est plus sensible au HTML invalide).

Remarque, comme l'a souligné matthewsheets Cela peut aussi être dû au fait que la div avec cet id n'existe pas du tout dans votre HTML (le cas pathologique de la div qui n'est pas rendue).

Ajout de l'échantillon de code de wf9a5m75 pour tout regrouper en un seul endroit :

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

Cela m'arrive tout le temps quand j'oublie de conditionner mes cartes script. En ajoutant : var mapExists = document.getElementByID("map-canvas") ; if(mapExists) { // script } tout s'arrange.

109voto

matthewsheets Points 431

Pour les autres qui rencontreraient encore ce problème Même après avoir suivi les recommandations ci-dessus, l'utilisation d'un sélecteur incorrect pour le canevas de votre carte dans la fonction d'initialisation peut provoquer le même problème, car la fonction tente d'accéder à quelque chose qui n'existe pas. Vérifiez que l'identifiant de votre carte correspond à celui de votre fonction d'initialisation et de votre HTML, sinon vous risquez d'obtenir la même erreur.

En d'autres termes, assurez-vous que vos identifiants correspondent. ;)

3 votes

Il est étonnant de constater que l'on peut être sûr que ce n'est pas le problème jusqu'à ce que l'on vérifie à nouveau et que l'on se rende compte que l'on l'a changé plus tôt et que l'on a oublié de le changer à nouveau. :-)

26voto

dpineda Points 389

Google utilise id="map_canvas" y id="map-canvas" dans les échantillons, vérifiez et revérifiez l'identité :D

23voto

wf9a5m75 Points 2709

Année, la réponse de geocodezip est correcte. Donc changez votre code comme ceci : (si vous avez encore des problèmes, ou peut-être quelqu'un d'autre dans le futur)

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

0 votes

Exactement, rendez d'abord le div html et ensuite le JS, puis ajoutez un écouteur d'événement.

11voto

Nikola Points 2491

Juste pour ajouter mon scénario d'échec pour que cela fonctionne. J'avais un <div id="map> avec lequel je chargeais la carte :

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

et le div était initialement caché et il n'avait pas de valeurs de largeur et de hauteur explicites, donc sa taille était width x 0 . Une fois que j'ai défini la taille de ce div dans le CSS comme ceci

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

tout a fonctionné ! J'espère que cela aidera quelqu'un.

0 votes

C'est exactement la raison pour laquelle ça n'a pas marché pour moi. Vous devez vous assurer que le CSS correspond à l'identifiant de votre carte et que vous avez une sorte de combinaison initiale de largeur/hauteur, sinon rien ne sera rendu. Donc, pour récapituler : 1. assurez-vous que l'identifiant de votre div html correspond au sélecteur d'identifiant lorsque vous appelez getElementById dans votre JavaScript 2. assurez-vous que le CSS contient du code pour styliser votre carte particulière, par exemple #map1 { width : 200px ; height : 200px ; } ou un code similaire, afin d'assurer le rendu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X