Search code examples
javascriptgoogle-mapsgoogle-maps-api-3google-maps-api-2

What is the correct way to completely remove GoogleMaps Autocomplete?


I use GoogleMap v3 AutoComplete and I need to completely remove it and unbind all event listeners. My code for initializing and binding to events looks like the following:

var autocomplete = new google.maps.places.Autocomplete($("input").get(0), {
   types: ["geocode"]
});

google.maps.event.addListener(autocomplete, 'place_changed', function () {
  // handle events
});

I don't find official way to correctly remove autocomplete and unbind all events. Please point me the right way.

Thanks.


Solution

  • For the unbinding of events use google.maps.event.clearInstanceListeners.

    For removing of the autocomplete-functionality there is no implemented method. You may create a clone of the input before you create the Automplete and when you want to remove the autocomplete-functionality replace the current input with the clone.

    //--------------------------------------------------------------
          //this overides the built-in Autocomplete and adds a remove-listener
          //execute it once when the API has been loaded
         (function(ac) {
             google.maps.places.Autocomplete = function(node, opts) {
               var clone = node.cloneNode(true),
                 pac = new ac(node, opts);
    
               google.maps.event
                 .addListener(pac,
                   'remove',
                   function(restore) {
                       google.maps.event.clearInstanceListeners(pac);
                       google.maps.event.trigger(node,'blur');
                       google.maps.event.clearInstanceListeners(node);
                     if (restore===true) {
                       node.parentNode.replaceChild(clone, node);
                     } else {
                       node.parentNode.removeChild(node)
                     }
                   });
               return pac;
    
             }
           }
           (google.maps.places.Autocomplete));
    //-------------------------------------------------------------------------- 
    
         function initialize() {
    
           autocomplete = new google.maps.places
             .Autocomplete(document.getElementsByTagName('INPUT')[0], {
               types: ["geocode"]
             });
         }
    
         google.maps.event.addDomListener(window, 'load', initialize);
    <script src="https://maps.googleapis.com/maps/api/js?v=3&libraries=places&.js"></script>
    <input/>
    <span>
      <input  type="button"  value="remove input" 
              onclick="google.maps.event.trigger(window.autocomplete,'remove');
                       this.parentNode.parentNode.removeChild(this.parentNode);"/>
      <input  type="button"  value="remove autocomplete-functionality" 
              onclick="google.maps.event.trigger(window.autocomplete,'remove',true);
                       this.parentNode.parentNode.removeChild(this.parentNode);"/>
    <span>

    The script adds a remove-listener to Automplete's. The listener accepts a single argument. Set it to true when you only want to remove the autocomplete-functionality. Otherwise the input will be removed completely.