2016-08-22 2 views
-1

J'ai un site Web qui extrait des emplacements d'une base de données MySQL et les transmet à une fonction JavaScript en tant qu'objet JSON. La fonction JavaScript crée dynamiquement des tables pour chaque ligne renvoyée à partir de la base de données. Chaque objet d'emplacement renvoyé inclut une latitude et une longitude et je souhaite créer une carte Google pour chaque objet. Je peux créer avec succès une carte sur la page à l'aide des données renvoyées à partir de la base de données, mais quand j'ajoute la carte code de création à la boucle qui construit des tables, il commence lancer cette erreur:Création dynamique de google maps à l'aide de javascript

TypeError: Cannot read property 'offsetWidth' of null 

Je suis passé par d'autres questions que les gens ont posté sur cette erreur. Les deux causes qu'il peut avoir sont (1) le <div> J'essaye d'ajouter la carte à n'existe pas, ou (2) j'essaye d'afficher la carte avant qu'elle soit créée. Je sais que les <div> s existent comme ils existent dans la page quand il est affiché. Je ne suis pas sûr de savoir comment vérifier ou résoudre l'autre problème.

Ceci est mon JavaScript qui récupère les données et construit les tables:

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

//THIS FUNCTIONS BUILD THE MAPS 
//PASS LAT, LONG, AND ID FOR DIV 
function initializeMap(latitude,longitude, mapID) 
{ 
    var myCenter = new google.maps.LatLng(latitude, longitude); 
    var mapProp = 
    { 
     center:myCenter, 
     zoom: 12, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 

    }; 
    var map=new google.maps.Map(document.getElementById(mapID), mapProp); 

    var marker=new google.maps.Marker({ 
     position:myCenter, 
     }); 

    marker.setMap(map); 
} 

function removeTable() 
{ 
    $("#tableID").remove(); 
} 

/* 
    ajaxRequest variable receives and parses a JSON object into a 2 dimensional array 
    an example of what a single row returned will look like: [["2","Alexandra","33 GRANT STREET","ALEXANDRA","3714","57721040","-37.18859863281250000000","145.70799255371094000000","","security"]] 
    when trying to access elements in the array using a loop, columns are as follows: 
    ajaxRequest[i][0] = database id 
    ajaxRequest[i][1] = name 
    ajaxRequest[i][2] = address 
    ajaxRequest[i][3] = suburb 
    ajaxRequest[i][4] = postcode 
    ajaxRequest[i][5] = phone 
    ajaxRequest[i][6] = latitude 
    ajaxRequest[i][7] = longitude 
    ajaxRequest[i][8] = description 
    ajaxRequest[i][9] = service_type 
*/ 
function search(option) 
{ 
    var ajaxRequest; 

    try{ 
     // Opera 8.0+, Firefox, Safari 
     ajaxRequest = new XMLHttpRequest(); 
    }catch (e){ 
     // Internet Explorer Browsers 
     try{ 
     ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
     }catch (e) { 
     try{ 
      ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
     }catch (e){ 
      // Something went wrong 
      alert("Your browser broke!"); 
      return false; 
     } 
     } 
    } 

    /* 
    1 = unsafe 
    2 = depressed 
    3 = sad 
    */ 
    if(option == 1) 
    {ajaxRequest.open("GET", "securitymodel.php", true);} 
    if(option == 2) 
    {ajaxRequest.open("GET", "depressedModel.php", true);}  
    if(option == 3) 
    {ajaxRequest.open("GET", "sadmodel.php", true);} 
    ajaxRequest.send(null); 

    // Create a function that will receive data 
    // sent from the server and will update 
    // div section in the same page. 
    var ajaxResult = 1; 

    ajaxRequest.onreadystatechange = function() 
    { 
     if(ajaxRequest.readyState == 4) 
     { 
     var ajaxDisplay = document.getElementById('ajaxDiv'); 
      //ajaxDisplay.innerHTML = ajaxRequest.responseText; 
      ajaxResult = JSON.parse(ajaxRequest.responseText); 

      if(ajaxResult.length > 0) 
     { 
     //IF SOMETHING IS RETURNED BEGIN BUILDING THE TABLE 
      var tableLocation = document.getElementById('suggestionTable'); 

      var tableArea = document.createElement('table'); 
      tableArea.id = 'tableID';  

      for(var i = 0; i < ajaxResult.length; i++) 
      {  //create inner row 
       var innerRow = document.createElement('tr'); 
       var innerTD = document.createElement('td'); 

       //WE MUST GO DEEPER!!! 
       var innerTable = document.createElement('table'); 
       var superInnerTD = document.createElement('td'); 
       var secondSuperInnerTD = document.createElement('td'); 

       //row 1 
       var nameTR = document.createElement('tr'); 
       var nameHead = document.createElement('td'); 
       var name = document.createTextNode('Name:'); 
       nameHead.appendChild(name); 
       nameTR.appendChild(nameHead); 

       var nameTD = document.createElement('td'); 
       var nameText = document.createTextNode(ajaxResult[i][1]); 
       nameTD.appendChild(nameText); 
       nameTR.appendChild(nameTD); 
       superInnerTD.appendChild(nameTR); 

       //row 2 
       var descTR = document.createElement('tr');   
       var descHead = document.createElement('td'); 
       var desc = document.createTextNode('Description:'); 
       descHead.appendChild(desc); 
       descTR.appendChild(descHead); 

       var descTD = document.createElement('td'); 
       var descText = document.createTextNode(ajaxResult[i][8]); 
       descTD.appendChild(descText); 
       descTR.appendChild(descTD); 
       superInnerTD.appendChild(descTR); 

       //row 3 
       var addTR = document.createElement('tr'); 
       var addressHead = document.createElement('td'); 
       var address = document.createTextNode('Address:'); 
       addressHead.appendChild(address); 
       addTR.appendChild(addressHead); 

       var addTD = document.createElement('td'); 
       var addressText = document.createTextNode(ajaxResult[i][2]); 
       addTD.appendChild(addressText); 
       addTR.appendChild(addTD); 
       superInnerTD.appendChild(addTR); 

       //row 4 
       var subTR = document.createElement('tr'); 
       var suburbHead = document.createElement('td'); 
       var suburb = document.createTextNode('Suburb:'); 
       suburbHead.appendChild(suburb); 
       subTR.appendChild(suburbHead); 

       var subTD = document.createElement('td'); 
       var subText = document.createTextNode(ajaxResult[i][3]); 
       subTD.appendChild(subText); 
       subTR.appendChild(subTD); 
       superInnerTD.appendChild(subTR); 

       //row 5 
       var postTR = document.createElement('tr'); 
       var postcodeHead = document.createElement('td'); 
       var postcode = document.createTextNode('Postcode:'); 
       postcodeHead.appendChild(postcode); 
       postTR.appendChild(postcodeHead); 

       var postTD = document.createElement('td'); 
       var postText = document.createTextNode(ajaxResult[i][4]); 
       postTD.appendChild(postText); 
       postTR.appendChild(postTD); 
       superInnerTD.appendChild(postTR); 

       //row 6 
       var phoneTR = document.createElement('tr'); 
       var phoneHead = document.createElement('td'); 
       var phone = document.createTextNode('Phone:'); 
       phoneHead.appendChild(phone); 
       phoneTR.appendChild(phoneHead); 

       var phoneTD = document.createElement('td'); 
       var phoneText = document.createTextNode(ajaxResult[i][5]); 
       phoneTD.appendChild(phoneText); 
       phoneTR.appendChild(phoneTD); 
       superInnerTD.appendChild(phoneTR); 

       //The divContainer requires an id 
       //ID IS AUTOMATICALLY GENERATED BY CONACTENATING THE NAME AND ADDRESS TOGETHER 
       var mapID = ajaxResult[i][1]+ajaxResult[i][2]; 
       var divContainer = document.createElement("div"); 
       divContainer.setAttribute("id", mapID); 
       secondSuperInnerTD.appendChild(divContainer); 

       initializeMap(ajaxResult[i][6],ajaxResult[i][7],mapID); 

       innerTable.appendChild(superInnerTD); 
       innerTable.appendChild(secondSuperInnerTD);    

       innerTD.appendChild(innerTable); 
       innerRow.appendChild(innerTD); 

       tableArea.appendChild(innerRow); 

      } 
      tableLocation.appendChild(tableArea); 
     } 
     } 
    } 
} 

Un exemple d'une table complété ressemble: enter image description here

Nous voulons mettre la carte dans la <td> à droite .

Pour réitérer, la génération de carte fonctionne lorsque nous essayons de construire 1 carte dans un <div> qui est codé en html sur la page. Lorsque nous essayons de créer plusieurs cartes à l'intérieur <div> s qui sont créées dynamiquement, il échoue.

Répondre

0

L'appel pour initialiser la carte se produit avant que le div est ajouté au DOM.

initializeMap(ajaxResult[i][6],ajaxResult[i][7],mapID); 

La ligne ci-dessus est appelée avant la ligne suivante:

tableLocation.appendChild(tableArea); 

La carte divs que vous créez sont ajoutés dynamiquement à la page lorsque cette ligne est exécutée. Pour cette raison, vous obtenez l'erreur.

Une solution de contournement consisterait à utiliser settimeout pour que la fonction initialize soit appelée une fois que les divs de carte aient été ajoutés au DOM.

setTimeout(function(){ initializeMap(ajaxResult[i][6],ajaxResult[i][7],mapID); }, 500); 

Une autre option consiste à pousser les données dans un tableau et itérer cette matrice après la tableLocation.appendChild (tableArea); ligne, puis appelez la fonction intializeMap en utilisant ces données