'myFunction - это не функция', JS & Google Maps v 3? - PullRequest
0 голосов
/ 22 октября 2010

Здравствуйте, я не могу понять, почему я получаю эту ошибку.

У меня есть список с входами, значения которых содержат широту / долготу / имя / адрес.

Печать маркеров на карте работает нормально, с помощью infowin работал нормально, пока я не понял, что он открывает только одну и ту же информацию во всех окнах.Итак, очевидно, мне нужно было прикрепить this (маркер, который я только что нажал) к EventListner.

Но при этом я получаю сообщение об ошибке view.createMarkerHTML is not a function.

Вопрос: Что мне сделать, чтобы прикрепить нужную информацию, которая должна быть открыта, на правом маркере?

view = {
        map: {
            init: function init (){
                view.map.initMap();
            },

            initMap: function initMap() {
                if(navigator.geolocation) {
                    function hasPosition(position) {
                        var point = new google.maps.LatLng(position.coords.latitude, position.coords.longitude),     
                        myOptions = {
                            zoom: 12,
                            center: point,
                            mapTypeId: google.maps.MapTypeId.ROADMAP
                        },   
                        mapDiv = document.getElementById("map"),
                        map = new google.maps.Map(mapDiv, myOptions);                        
                        view.map.handleMarkers(map);

                    }                    
                    navigator.geolocation.getCurrentPosition(hasPosition);

                } 
            },


            handleMarkers: function handleMarkers(map) {
                var list = $('#pois input'),
                    l = list.length,
                    i = 0, lat = '', long = '', marker = {}, theName = '', address = '', info = {};



                 for (i = 0; i < l; i += 1) {
                    info = $(list[i]).val().split('|');
                    lat = parseFloat(info[0], 10);
                    long = parseFloat(info[1], 10);
                    theName = info[2];
                    address = info[3];

                    marker = new google.maps.Marker({
                        position: new google.maps.LatLng(lat, long),
                        map: map,
                        icon: icon
                    }); 



                    google.maps.event.addListener(marker, 'click', function() {
                        currentMarker = this;view.map.createMarkerHTML(map, theName, address);
                    });                  
                 } 
            } ,

             createMarkerHTML: function createMarkerHTML(map, theName, address) {

                var contentString =
                    '<div id="gMapInfoWin">' +
                        '<h1>' + theName + '</h1>' +
                        '<ul>' +
                            '<li>' + address + '</li>' +
                        '</ul>' +
                    '</div>'
                ;

                currentMarker.infowindow = new google.maps.InfoWindow({
                    content: contentString
                });

                currentMarker.infowindow.open(map, currentMarker);
            } 
       }
};

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Разве вы не должны использовать замыкание для сохранения значений ваших переменных, установленных в цикле?

(function(theName, address) {
    google.maps.event.addListener(marker, 'click', function() {
        currentMarker = this;view.map.createMarkerHTML(map, theName, address);
    });
}(theName, address));

Вы можете даже добавить свой маркер в параметр вместо использования currentMarker

0 голосов
/ 22 октября 2010
for (i = 0; i < l; i += 1) {
                    info = $(list[i]).val().split('|');
                    lat = parseFloat(info[0], 10);
                    long = parseFloat(info[1], 10);

                    marker = new google.maps.Marker({
                        position: new google.maps.LatLng(lat, long),
                        map: map,
                        icon: icon
                    }); 

                   marker.theName = info[2];
                   marker.address = info[3];

                    google.maps.event.addListener(marker, 'click', function() {
                        currentMarker = this;   
                        m_name = this.theName;    
                        m_address = this.address        
                        view.map.createMarkerHTML(map, m_name, m_address);
                    });                  
                 } 

marker.theName = info [2];marker.address = info [3];currentMarker = this;
m_name = this.theName;
m_address = this.address

... это решение!

0 голосов
/ 22 октября 2010

Держу пари, что это проблема с ограничениями.Не имея доступа к вашим библиотекам, я не могу быть уверен, что это будет работать, но попробуйте заменить:

google.maps.event.addListener(marker, 'click', function() {
    currentMarker = this;view.map.createMarkerHTML(map, theName, address);
});

на:

  google.maps.event.addListener(marker, 
                                'click', 
                                createClickListener(  this, 
                                                      map, 
                                                      theName, 
                                                      address ) );

, а затем добавить эту функцию где-нибудь еще впрограмма:

function createClickListener( cm, map, theName, address )
{
    return function() {
        currentMarker = cm;
        view.map.createMarkerHTML(map, theName, address);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...