2016-08-22 14 views
-1

私は、MySQLデータベースから位置情報を取得し、JSONオブジェクトとしてJavaScript関数に渡すWebサイトを持っています。 JavaScript関数は、データベースから返された各行のテーブルを動的に作成します。返される各位置オブジェクトには緯度と経度が含まれており、オブジェクトごとにGoogleマップを作成したいと考えています。私は正常にデータベースから返されたデータを使用して、ページ上の1つのマップを作成することができますが、私はテーブルを構築ループにマップの作成コードを追加するときには、このエラー投げ始まる:JavaScriptを使用して動的にGoogleマップを作成する

TypeError: Cannot read property 'offsetWidth' of null 

私は他の質問の人を介して行ってきたがこのエラーについて投稿しました。それが持つことができる2つの原因は、(1)<div>にマップを追加しようとしているか、または(2)作成前にマップを表示しようとしています。 <div>は、表示されているときにページに存在するので存在します。私は他の問題を調べたり修正したりする方法がわかりません。

これは、データを取得し、テーブルを構築し、私はJavaScriptである:我々は右側に<td>にマップを入れたい enter image description here

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

完了テーブルの例がどのように見えます。

これを繰り返して言うと、ページ上のhtmlでコード化された<div>の1つのマップを作成しようとしているときにマップの生成が機能します。 <div>の中に動的に作成された複数のマップを作成しようとすると失敗します。

答えて

0

マップを初期化する呼び出しは、divがDOMに追加される前に行われます。

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

上記の行を次の行の前に呼び出されます。この行が実行されたときにページに追加され、動的に作成

tableLocation.appendChild(tableArea); 

地図のdiv。このため、エラーが発生しています。

回避策の1つは、map divがDOMに追加された後にinitialize関数が呼び出されるように、settimeoutを使用することです。

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

別のオプションは、アレイにデータをプッシュしtableLocation.appendChild(tableArea)後にその配列を反復することです。そのデータを使用してintializeMap関数を呼び出す

関連する問題