-2

试图访问函数中数组的索引值。该数组有 4 条记录,但仅访问索引 1 - 3 个值,未访问数组中的最后一个值,仅创建 3 个标记。Jquery 抛出TypeError: a.eb is undefinedTypeError: b is undefined。数组变量是 global_citizens。

MakeRouteCallBack函数发生错误

marker[rNum] = createMarker(legs[i].start_location,"start",legs[i].start_address,ctype);

控制台打印结果

sdfsd sfsdf
fsdf sdfsdf
john wells
sdfdf dfrre

10.58909,-61.13388800000001-10.5089259,-61.3822726,2

10.66753800802045,-61.51776409679476-11.3165044,-60.53128919999999,3

10.67278501519437,-61.51673537546543-10.2690277,-61.3422372,2

10.67107578209723,-61.51689561536466-10.65,-61.4,4

Citizen icon is 2
Citizen icon is 3
Citizen icon is 4

TypeError: a.eb is undefined.......

代码:

创建标记

 function createMarker(latlng, label, html,citizenType) {

     var contentString = '<b>'+label+'</b><br>'+html;

     console.log('Citizen icon is '+citizenType);     

    //replaces if...then..else...else if. Icon source are placed in an array that corresponds to value of the citizenType.
    //array starts from 0 . The first value of the citizens type is 2 so array should have a value at the 2 location 
    //so jquery will map the icon to the citizenType based on its matching location in the array

      var markerSource = [null,
                         'resources/icons/criminal_new.ico',
                         'resources/icons/victim_new.ico',
                         'resources/icons/suspect_new.ico'];


    var icon = markerSource[citizenType];

        var marker = new google.maps.Marker({
          position: latlng,
          map: map,
          title: label,
          icon: new google.maps.MarkerImage(icon),
          zIndex: Math.round(latlng.lat()*-100000)<<5
          });
          marker.myname = label;        

      google.maps.event.addListener(marker, 'click', function() {
          infowindow.setContent(contentString); 
          infowindow.open(map,marker);
          });
      return marker;
  } 

设置路线

   function setRoutes(){    

        var directionsDisplay = new Array();

        for (var i=0; i< global_citizens.length; i++){

        var rendererOptions = {
            map: map,
            suppressMarkers : true,
             preserveViewport: true
        }
        directionsService = new google.maps.DirectionsService();

        var travelMode = google.maps.DirectionsTravelMode.DRIVING;  

        console.log(global_citizens[i].startLat+','+global_citizens[i].startLng+'-'+global_citizens[i].endLat+','+global_citizens[i].endLng+','+global_citizens[i].citizenType);

        var request = {
            origin: global_citizens[i].startLat+','+global_citizens[i].startLng,
            destination: global_citizens[i].endLat+','+global_citizens[i].endLng,
            travelMode: travelMode
        };  

            directionsService.route(request,makeRouteCallback(i,directionsDisplay[i],global_citizens[i].citizenType));

        }

MakeRouteCallBack

    function makeRouteCallback(rNum, disp,ctype){   
     if (polyline[rNum] && (polyline[rNum].getMap() != null)) {
           startAnimation(rNum);
           return;
          }

        return function(response, status){      

          if (status == google.maps.DirectionsStatus.OK){

            var bounds = new google.maps.LatLngBounds();
            var route = response.routes[0];
            startLocation[rNum] = new Object();
            endLocation[rNum] = new Object();


            polyline[rNum] = new google.maps.Polyline({
            path: [],
            strokeColor: '#FFFF00',
            strokeWeight: 3
            });

            poly2[rNum] = new google.maps.Polyline({
            path: [],
            strokeColor: '#FFFF00',
            strokeWeight: 3
            });     


            // For each route, display summary information.
            var path = response.routes[0].overview_path;
            var legs = response.routes[0].legs;

            disp = new google.maps.DirectionsRenderer(rendererOptions);     
            disp.setMap(map);
            disp.setDirections(response);


            //Markers               
            for (i=0;i<legs.length;i++) {
              if (i == 0) { 
                startLocation[rNum].latlng = legs[i].start_location;
                startLocation[rNum].address = legs[i].start_address;
                // marker = google.maps.Marker({map:map,position: startLocation.latlng});


                //console.log('(i) The Citizen Type Is : '+ global_citizens[i].citizenType);
                marker[rNum] = createMarker(legs[i].start_location,"start",legs[i].start_address,ctype);                    

              }

              endLocation[rNum].latlng = legs[i].end_location;
              endLocation[rNum].address = legs[i].end_address;
              var steps = legs[i].steps;

              for (j=0;j<steps.length;j++) {
                var nextSegment = steps[j].path;                
                var nextSegment = steps[j].path;

                for (k=0;k<nextSegment.length;k++) {
                    polyline[rNum].getPath().push(nextSegment[k]);
                    //bounds.extend(nextSegment[k]);            


                }

              }
            }           
        }

         polyline[rNum].setMap(map);
         //map.fitBounds(bounds);        
        startAnimation(rNum);   

        }

    }   
4

1 回答 1

1

您的代码不容易理解,但是您的回调有时会返回未定义的函数,有时会返回一个函数,这可能会导致 TypeError,因为当 API 需要一个函数时,您可能会返回未定义的函数......但这只是一个猜测...... .

对数组的索引是错误的,你的变量我取值从 1 到 3,当我变成 4 时,你在数组之外进行索引,因此你得到一个 TypeError,对数组的索引应该从 0 开始。

于 2013-09-23T15:42:12.237 回答