0

我想精简我的initialize()功能......但每次我这样做时,它都会破坏我的代码。我最终试图做这样的事情我有一个侧边栏,里面有与地图上的标记直接相关的东西,AJAX'd in... 首先,我希望能够将其他功能放在外面initialize()功能 。这工作正常:

<script>

  function initialize() {
    // create the map object
    var mapOptions = {
      zoom: 14,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };    
    var map = new google.maps.Map(document.getElementById("map_canvas"), 
        mapOptions);

    // create your location marker
    var mylocOptions = {
      draggable: true,
      animation: google.maps.Animation.DROP,
      icon: new google.maps.MarkerImage('//maps.gstatic.com/mapfiles/mobile/mobileimgs2.png',
            new google.maps.Size(22,22),
            new google.maps.Point(0,18),
            new google.maps.Point(11,11)),
      title: "You are here..."
    };
    var myloc = new google.maps.Marker(mylocOptions);

    // get location information from browser, or from user input, or from database
    <% if !signed_in? || !current_user.loc %>
      if (navigator.geolocation) navigator.geolocation.getCurrentPosition(function(pos) {
        var me = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
        myloc.setPosition(me);
        myloc.setMap(map);
        map.setCenter(me);
        $.ajax({
          data: { me: me.toString() },
          type: 'POST',
          url: '/set-location'
        })
      }, function(error) {
          var address = prompt('Where are you looking?');
          geocoder = new google.maps.Geocoder();
          geocoder.geocode({ 'address': address }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
              var me = results[0].geometry.location
              myloc.setPosition(me);
              myloc.setMap(map);
              map.setCenter(me);
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            };
          });
      });
    <% else %>
      var me = new google.maps.LatLng(<%= current_user.loc %>);
      myloc.setPosition(me);
      myloc.setMap(map);
      map.setCenter(me);
      map.setZoom(12);
    <% end %>

    // watch for marker movement, and update location accordingly
    var oldPos = myloc.getPosition();
    google.maps.event.addListener(myloc, "dragend", function(e){
      revGeo = new google.maps.Geocoder();
      var newPos = myloc.getPosition();
      $.ajax({
        data: { me: newPos.toString() },
        type: 'GET',
        url: '/set-location'
      })
      if(oldPos != newPos)
        revGeo.geocode({'latLng': newPos}, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
              $('#loc').html(results[1].formatted_address);
            }
          } else {
            alert("Geocoder failed due to: " + status);
          }
        });
      oldPos = newPos;
    });

    // when creating an event, check for event location,
    // verify it's existance and put a marker down on the map
    $(document).on('focusout', '#event_location', function() {
      geocoder = new google.maps.Geocoder();
      address = document.getElementById("event_location").value;
      geocoder.geocode({ 'address': address }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var coords = results[0].geometry.location;
          map.setCenter(coords);
          var marker = new google.maps.Marker({
            map: map,
            animation: google.maps.Animation.DROP,
            position: coords
          });
          $('#coords').html('coordinates: ' + coords)
          $('#event_geocode').val(coords.toString())
        } else {
          alert(status + " for " + address);
        };
      });
    });
  }
</script>

...但我相信它可以被打破。事实上,我知道它必须被分解才能开始做我想做的事情。关于我做错了什么的任何想法?

4

1 回答 1

2

使您的 var 映射成为全局变量(在任何函数之外声明)。

// Global
var map;

接着...

function initialize() {
    // create the map object
    var mapOptions = {
      zoom: 14,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };

  // Do not use the var keyword inside the function.    
    map = new google.maps.Map(document.getElementById("map_canvas"), 
        mapOptions);

// etc..
于 2013-02-24T07:48:54.070 回答