Can we make custom overlays draggable on google maps V3

后端 未结 1 2051
独厮守ぢ
独厮守ぢ 2020-12-05 06:04

The markers are draggable, but I cannot have a custom div on a marker which changes on hover click etc. hence I thought of using custom overlays, but I am not able to find o

相关标签:
1条回答
  • 2020-12-05 06:32

    Yes, we can.

    DraggableOverlay.prototype = new google.maps.OverlayView();
    
    DraggableOverlay.prototype.onAdd = function() {
      var container=document.createElement('div'),
          that=this;
    
      if(typeof this.get('content').nodeName!=='undefined'){
        container.appendChild(this.get('content'));
      }
      else{
        if(typeof this.get('content')==='string'){
          container.innerHTML=this.get('content');
        }
        else{
          return;
        }
      }
      container.style.position='absolute';
      container.draggable=true;
          google.maps.event.addDomListener(this.get('map').getDiv(),
                                           'mouseleave',
                                            function(){
              google.maps.event.trigger(container,'mouseup');
            }
          );
    
    
          google.maps.event.addDomListener(container,
                                           'mousedown',
                                       function(e){
            this.style.cursor='move';
            that.map.set('draggable',false);
            that.set('origin',e);
    
            that.moveHandler  = 
                  google.maps.event.addDomListener(that.get('map').getDiv(),   
                                                   'mousemove',
                                                   function(e){
                 var origin = that.get('origin'),
                     left   = origin.clientX-e.clientX,
                     top    = origin.clientY-e.clientY,
                     pos    = that.getProjection()
                                   .fromLatLngToDivPixel(that.get('position')),
                     latLng = that.getProjection()
                              .fromDivPixelToLatLng(new google.maps.Point(pos.x-left,
                                                                        pos.y-top));
                     that.set('origin',e);
                     that.set('position',latLng);
                     that.draw();
                });
    
    
            }
         );
    
          google.maps.event.addDomListener(container,'mouseup',function(){
            that.map.set('draggable',true);
            this.style.cursor='default';
            google.maps.event.removeListener(that.moveHandler);
          });
    
    
      this.set('container',container)
      this.getPanes().floatPane.appendChild(container);
    };
    
    function DraggableOverlay(map,position,content){
      if(typeof draw==='function'){
        this.draw=draw;
      }
      this.setValues({
                     position:position,
                     container:null,
                     content:content,
                     map:map
                     });
    }
    
    
    
    DraggableOverlay.prototype.draw = function() {
      var pos = this.getProjection().fromLatLngToDivPixel(this.get('position'));
      this.get('container').style.left = pos.x + 'px';
      this.get('container').style.top = pos.y + 'px';
    };
    
    DraggableOverlay.prototype.onRemove = function() {
      this.get('container').parentNode.removeChild(this.get('container'));
      this.set('container',null)
    };
    

    It observes the mousemove-event and modifies the top/left-style of the overlay based on the distance from the last mouse-position.


    Usage:

    new DraggableOverlay( 
           map,//maps-instance
           latLng,//google.maps.LatLng
           'content',//HTML-String or DOMNode
           function(){}//optional, function that ovverrides the draw-method
           );
    

    The top-left-corner of the overlay by default will be placed at the position provided via the latLng-argument.

    To apply a custom drawing use the optional draw-argument of the constructor .


    Demo: http://jsfiddle.net/doktormolle/QRuW8/


    Edit: This solution will only work up to version 3.27 of the google maps api. Within the release of 3.28 there were changes made on the draggable option of the map.

    Release Notes: https://developers.google.com/maps/documentation/javascript/releases#328

    0 讨论(0)
提交回复
热议问题