2013-02-21 5 views
2

Застрять на Google MapsНесколько карт на одной странице - ColdFusion

Использование ColdFusion - Я заселение список Арены ... я хочу выпадающий из карты, если у них есть один - и ссылку, чтобы добавить карта. Ссылки, чтобы заполнить карту и отметить ее работу.

Когда у меня есть несколько записей - я не получаю несколько карт - получаю только отображение последнего результата.

Я пробовал другое кодирование, которое я использовал в прошлом, но все равно не повезло с несколькими картами - поэтому, начиная с этого более легкого вида javascript.

Любая помощь приветствуется. Удаление старого кода - идти к тому, что в настоящее время работает - просто не показывать маркеры

<img src="../images/gps1.png" height=25 border=0 alt="Show Map" onclick="javascript:showElement('g#aid#')"> 

Кроме того - когда я использую стиль = «дисплей: нет;» с помощью Google Карты Div:

<div id="g#aid#" style="width: 600px; height: 300px;" style="display:none;"></div> 

выпадающая карта искажена и не центрирована. Без него - он закрывается и открывается просто отлично, но всегда остается открытым.

Как было предложено - вот выход Javascript ... Здесь выводится ниже 2 результатов ... Только последняя карта показывает ..

Ниже некоторый прогресс - начиная с Google API - это где я «м в ...

Существует тело OnLoad, чтобы сделать эту работу ...

Все карты показывают правильно ... даже добавил еще ... Просто не получает маркеры ... I попробовали код Google Marker ... Не повезло ... Так что просто собираюсь код, который правильно отображает карты. .

Просто нужно понять маркер карты из ...

<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script> 

    <cfoutput query=arena"> 


    <script> 
    var map; 
    function initialize() { 
    var mapOptions = { 
     zoom: 13, 
     center: new google.maps.LatLng(#arena.agpslat#,#arena.agpslong#), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    map = new google.maps.Map(document.getElementById('g#arena.aid#'), 
     mapOptions); 

    } 

    google.maps.event.addDomListener(window, 'load', initialize); 
    </script> 

    <div id="g#arena.aid#" style="width: 600px; height: 300px;"></div> 

    </cfoutput> 

Добавление этого: Не поймите меня маркер ...

var marker = new google.maps.Marker({ 
     position: myLatlng, 
     map: map, 
     title: '#arena.arename#' 
    }); 
+0

Вы все еще создаете свою функцию 'initialize' более одного раза, подразумевая, что это все еще происходит внутри цикла запроса. Посмотрите, как я это делаю в своем ответе. – duncan

+0

У меня нет карт с предложением ниже ... Уверен, чтобы удалить инициализацию из тела тоже ... Все еще играю ... С начальным кодированием я всегда могу получить вторую карту (просто тестирование с 2 результатами) - это всегда последний результат. –

+0

Последний код, который вы добавили, не отображается правильно - вам нужно [отредактировать вопрос] (http://stackoverflow.com/posts/15007155/edit), выберите код, затем нажмите кнопку формата кода (пара фигурных скобок ** '{}' **), и он будет соответствующим образом форматировать/удалять этот блок кода. –

ответ

2

Проблема вы звоните в JS файл и определение идентично названной функции в вашем цикле запросов. Вам нужно переместить этот материал из цикла запросов, чтобы вы только вызывали файл и создавали функцию один раз.

Таким образом, вместо того, чтобы каждый раз, когда он был в вашей петле, была инициализирована функция инициализации, переместите это из цикла. И вместо этого есть вызов этой функции из цикла, передавая в нее разные значения lat/lng, идентификаторы div и имена.

Избавьтесь от существующих вызовов функций инициализации из тега body и просто используйте прослушиватели событий Google, когда загружается окно, каждый раз передавая разные параметры initialize.

Что-то вроде следующего:

<script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script> 

<script> 
    var arenas = []; // array of arenas, to be populated later within the query loop 
    function initialize() { 
    var intArena, myLatlng, mapOptions, map, marker; 

    // loop over all the arenas, creating maps and markers for each 
    for (intArena = 0; intArena < arenas.length; intArena++) { 
     myLatlng = new google.maps.LatLng(arenas[intArena].lat, arenas[intArena].lng); 
     mapOptions = { 
     zoom: 11, 
     center: myLatlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     } 
     map = new google.maps.Map(document.getElementById(arenas[intArena].id), mapOptions); 

     marker = new google.maps.Marker({ 
      position: myLatlng, 
      map: map, 
      title: arenas[intArena].name 
     }); 
    } 
    } 

    google.maps.event.addDomListener(window, 'load', initialize); 
</script> 

<cfoutput query="arena"> 
    <cfif arena.agpslat is not "" and arena.agpslong is not ""> 
    <script> 
     // add struct of arena data to the array for use later on in the initialize function 
     arenas.push({ 
     lat: #arena.agpslat#, 
     lng: #arena.agpslong#, 
     id: 'g#arena.aid#', 
     name: '#JsStringFormat(arena.arenaname)#' 
     }); 
    </script> 

    <div id="g#arena.aid#" style="width: 600px; height: 300px;"></div> 
    </cfif> 

    <div align=center>g#arena.aid#<br><b>[ <a href="arenagps.cfm?aid=#arena.aid#"><font color=cc3300>Change/Add Using Map Function</font></a> ]</b><br></div> 
</cfoutput> 

Также обратите внимание, что я приставкой ссылки на столбцах запроса с именем запроса. Это почти всегда хорошая идея, чтобы правильно охватить все ваши переменные.

+0

No Go - All Blank ... Никаких карт вообще ... Будет продолжать играть ... Я изменяю переменные, когда мне тоже ... Мое понимание заключалось в том, чтобы не делать этого, когда вам не нужно, - что держит ur фактический код нужно немного меньше/быстрее ... Просто быстро играл с ур кодом Дункан ... Будет продолжать играть ... –

+0

проверить на ошибки JS, и может быть полезно также добавить сгенерированный JS на ваш вопрос. Фактическое определение области действия [улучшает производительность] (http://www.cfgears.com/index.cfm/2010/9/22/The-importance-of-proper-variable-scoping) – duncan

+0

Дункан - код ur работает слишком ... Я соглашусь на том или другом ... Теперь, чтобы получить печально известный div style = "display: none", чтобы работать. Это одна из головных болей от того, что я тоже понимаю ... –

-1

Got ... Thx для предложений все ...

Потребности

<body onload="initialize()"> 

ColdFusion Coding - использовали переменную переименовать функцию и mapoption - поэтому они всегда разные.

<cfoutput query=arena> 

    <cfif arena.agpslat is not "" and arena.agpslong is not ""> 

    <script type="text/javascript"> 
function initialize() { 
    var #arena.aid#Latlng = new google.maps.LatLng(#arena.agpslat#,#arena.agpslong#); 

    var #arena.aid#Options = { 
     zoom: 15, 
     center: #arena.aid#Latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    var map = new google.maps.Map(document.getElementById("g#arena.aid#"), #arena.aid#Options); 

    var marker = new google.maps.Marker({ 
     position: #arena.aid#Latlng, 
     map: map, 
     title: '#arena.arenaname#' 
     }); 

} 

google.maps.event.addDomListener(window, 'load', initialize); 
    </script> 

    <div id="g#arena.aid#" style="width: 600px; height: 300px;"></div> 



    <div align=center>g#arena.aid#<br><b>[ <a href="arenagps.cfm?aid=#arena.aid#"><font color=cc3300>Change/Add Using Map Function</font></a> ]</b><br></div> 

    </cfif> 

</cfoutput> 
+0

Извините, что работает для вас, но это не очень хороший подход, и я удивлен, что он работает вообще (подумайте о повторение кода, которое вы делаете в javascript)! Я отредактирую свой ответ так, чтобы каждый раз вызывать одну и ту же функцию инициализации с разными параметрами, из тела onload – duncan

+0

В конце я не передаю никакие параметры для 'initialize' - я создаю глобальный массив структур, каждый структура, содержащая данные арены. Затем функция просто перебирает массив, добавляя маркеры и карты для каждого из них – duncan

Смежные вопросы