前提・実現したいこと
Ruby on Railsを使って作った投稿フォームを、JQueryで複製して複数投稿をできるものを作っています。
投稿フォームの複製はできているのですが、複製されたフォームでGoogleMap上に任意でマーカーを落とせるようにしたいです。
発生している問題・エラーメッセージ
Uncaught TypeError: Cannot read property 'setCenter' of undefined
該当のソースコード
・・・ <!-- 投稿フォーム --> <% j = 0 %> <%= c.fields_for :travelogues do |t| %> <!-- Jqueryで複製されるフォーム部分 --> <div class="form-block" id="form-block"> <input name="del" type="button" value="この投稿を削除する" class="del del-button edit-form btn btn-md btn-danger "> <table class="table"> <tr> <th class="show-th"><%= t.label "本文",class:"th-font" %></th> <td><%= t.text_area :body, name:"body", class:"form-control" %></td> </tr> <tr> <th rowspan="2" class="show-th"> <%= t.label :address, "スポット名(Google Mapで検索)", class:"th-font" %> </th> <td> <%= t.text_field :address, placeholder: "スポット名を入力", name:"address", id:"address_#{j}" %> <input name="onclick" onclick='codeAddress("<%= j %>")' type="button", value="検索"></input> </td> </tr> <tr> <td colspan="2"> <div name="map" id="map_<%= j %>" style="height: 300px; width: 80%;"></div> </td> </tr> </table> <input type="button" value="投稿を追加する" class="add edit-form btn btn-md btn-danger"> </div> <% end %> ・・・
js
1// 動的に投稿フォームを追加する用 2let idNo = 1; 3 4// class="add"がクリックされたらフォームをクローンする 5$(document).on("click", ".add", function () { 6 // 投稿削除のボタンを表示させる 7 $("input[name=del]").removeClass("del-button"); 8 $(this).parent() 9 // フォームをコピー 10 .clone(true) 11 // idを削除 12 .removeAttr("id") 13 // 新たにidを付与 14 .find("input[name=body]") 15 .attr("id", "body" + idNo) 16 .end() 17 .find("[name=map]") 18 .attr("id", "map_" + idNo) 19 .end() 20 .find("input[name=onclick]") 21 .attr("onclick", "codeAddress(" + idNo + ")") 22 .end() 23 .find("input[name=address]") 24 .attr("id", "address_" + idNo) 25 .end() 26 // 親要素の後にinsert 27 .insertAfter($(this).parent()); 28 // ID番号加算 29 idNo++; 30}); 31// class="del"がクリックされたらフォームを削除 32$(document).on("click", ".del", function () { 33 // 2ヵ所で使うので選択された親要素を変数targetに格納 34 var target = $(this).parent(); 35 // 変数targetの親要素下の要素数が1以下だったら 36 // 変数targetを削除 37 if(target.children().length > 1){ 38 target.remove(); 39 } 40});
js
1let maps = [] //変数の定義 2let geocoder //変数の定義 3 4function initMap(){ //最初にGooglemapを表示する時のコールバック関数 5 geocoder = new google.maps.Geocoder() //GoogleMapsAPIジオコーディングサービスにアクセス 6 if(document.getElementById('map_0')){ //'map'というidを取得できたら実行 7 // 地図を複数表示させるためfor文でループ 8 for (var i = 0; i < 10; i++) { 9 maps[i] = new google.maps.Map(document.getElementById('map_' + i), { //'map'というidを取得してマップを表示 10 center: {lat: 35.6594666, lng: 139.7005536}, //最初に表示する場所(今回は「渋谷スクランブル交差点」が初期値) 11 zoom: 15, //拡大率(1〜21まで設定可能) 12 }); 13 } 14 }else{ //'map'というidが無かった場合 15 for (var i = 0; i < 10; i++) { 16 maps[i] = new google.maps.Map(document.getElementById('show_map_' + i), { //'show_map'というidを取得してマップを表示 17 center: {lat: gon.lat[i].latitude, lng: gon.lng[i].longitude}, //controllerで定義した変数を緯度・経度の値とする(値はDBに入っている) 18 zoom: 15, //拡大率(1〜21まで設定可能) 19 }); 20 marker = new google.maps.Marker({ //GoogleMapにマーカーを落とす 21 position: {lat: gon.lat[i].latitude, lng: gon.lng[i].longitude}, //マーカーを落とす位置を決める(値はDBに入っている) 22 map: maps[i] //マーカーを落とすマップを指定 23 }); 24 } 25 } 26}; 27function codeAddress(j){ //検索ボタンを押した時のコールバック関数 28 // ここは引数を渡すだけでループさせない 29 let inputAddress = document.getElementById('address_' + j).value; //'address'というidの値(value)を取得 30 geocoder.geocode( { 'address': inputAddress}, function(results, status) { //ジオコードしたい住所を引数として渡す 31 if (status == 'OK') { 32 console.log(results[0].geometry.location) 33 maps[j].setCenter(results[0].geometry.location); //検索値に最も近い結果の緯度・経度 34 let marker = new google.maps.Marker({ 35 map: maps[j], //マーカーを落とすマップを指定 36 position: results[0].geometry.location //マーカーを落とす位置を決める 37 }); 38 } else { 39 alert('該当する結果がありませんでした'); 40 } 41 }); 42};
試したこと
console.logで見ると、複製されたフォームでも緯度・経度の取得はできていました。
補足情報(FW/ツールのバージョンなど)
・Ruby
Rails 5.2.4.1
回答3件
あなたの回答
tips
プレビュー