80

I have a Google Maps Autocomplete input field inside a Twitter Bootstrap modal dialog and the autocomplete result is not displayed. However, if I press the down arrow key, it selects the next autocomplete result, so it seems that the autocomplete code works correctly, only that the result is not displayed correctly. Maybe it's hidden behind the modal dialog?

Here's the screenshots :

Typing something in the autocomplete field gives nothing Typing something in the autocomplete field gives nothing

Pressing the arrow down key gives the first result Pressing the arrow down key gives the first result

And the code :

<div class="modal hide fade" id="map_modal">
<div class="modal-body">
    <button type="button" class="close" data-dismiss="modal">×</button>
    <div class="control-group">
        <label class="control-label" for="keyword">Cari alamat :</label>
        <div class="controls">
            <input type="text" class="span6" name="keyword" id="keyword">
        </div>
    </div>
    <div id="map_canvas" style="width:530px; height:300px"></div>
</div>
<div class="modal-footer">
    <a href="#" class="btn" data-dismiss="modal">Close</a>
    <a href="#" class="btn btn-primary">Save changes</a>
</div>

<script type="text/javascript">
$("#map_modal").modal({
    show: false
}).on("shown", function()
{
    var map_options = {
        center: new google.maps.LatLng(-6.21, 106.84),
        zoom: 11,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map_canvas"), map_options);

    var defaultBounds = new google.maps.LatLngBounds(
        new google.maps.LatLng(-6, 106.6),
        new google.maps.LatLng(-6.3, 107)
    );

    var input = document.getElementById("keyword");
    var autocomplete = new google.maps.places.Autocomplete(input);
    autocomplete.bindTo("bounds", map);

    var marker = new google.maps.Marker({map: map});

    google.maps.event.addListener(autocomplete, "place_changed", function()
    {
        var place = autocomplete.getPlace();

        if (place.geometry.viewport) {
            map.fitBounds(place.geometry.viewport);
        } else {
            map.setCenter(place.geometry.location);
            map.setZoom(15);
        }

        marker.setPosition(place.geometry.location);
    });

    google.maps.event.addListener(map, "click", function(event)
    {
        marker.setPosition(event.latLng);
    });
});
</script>

I've tried my best to solve this on my own, but since I don't know the html&css for the autocomplete result (inspect element gives nothing), I'm in a lost now. Any helps?

Thanks before!

Furunomoe
  • 1,344
  • 2
  • 16
  • 27
  • 2
    I made some progress, but hit a wall. I'll explain what I discovered to try to help others hopefully solve your question. I re-arranged the text box and it looks like the autocomplete is not only behind the modal, but behind the gray-out area too (check this demo) http://jsfiddle.net/Y4WgX/embedded/result/ Changing the z-index was ineffective. I also learned the suggestions are in a div with class called pac-container, so I changed its color to green to demonstrate. – Tina CG Hoehr Jun 09 '12 at 02:55

10 Answers10

132

The problem is with the z-index of the .modal

Use this CSS markup:

.pac-container {
    background-color: #FFF;
    z-index: 20;
    position: fixed;
    display: inline-block;
    float: left;
}
.modal{
    z-index: 20;   
}
.modal-backdrop{
    z-index: 10;        
}​

Also you can check the final demo here

ps: thanks to @lilina for that demo on jsfiddle.com

Luis
  • 5,786
  • 8
  • 43
  • 62
  • Why is all this necessary? I know it is, but why? Also this puts the modal up to far for me and the bootstrap static nav-bar is now over it. Alternatives? – Marc M. Apr 09 '14 at 07:27
  • @MarcM. What version of bootstrap are you using? I think it would be better if you open up a new question with full details of your problem. – Luis Apr 09 '14 at 12:12
  • 9
    I found that this put my modal behind my nav bar, it didn't look right. Try changing the z index of the .pac-container to 1050 – Jeff Finn Sep 11 '14 at 21:10
  • @JeffFinn Ok you can open a new question and I can try to help you, you have to check that this is bootstrap 2, are you using the same version? If that's the case I don't see the reason of downvoting the answer, as you can see it has helped a few people. – Luis Sep 12 '14 at 23:17
  • I have it working. That's what I was trying to say. I set .pac-container to 1050 like what is said in one of the answers below. Thanks for the offer tho – Jeff Finn Sep 13 '14 at 15:58
  • 4
    .pac-container { z-index: 1070; } is only thing you need. If you have .navbars in your page they have a different z-Index instead of changing all your bootstrap z-index might as well just do the z-index on GMaps. This problem also occurs with GeoComplete.js – user706001 Feb 07 '15 at 16:03
  • @Luis Thanks a lot. It is very helpful to me – Nikhil sHETH Mar 03 '17 at 13:54
74
.pac-container {
    z-index: 1051 !important;
}

did it for me

https://github.com/twbs/bootstrap/issues/4160

16

Bootstrap's .modal z-index is by default 1050.

jQuery UI's .ui-autocomplete z-index is by default 3.

So put this on the CSS:

/* Fix Bootstrap .modal compatibility with jQuery UI Autocomplete,
see http://stackoverflow.com/questions/10957781/google-maps-autocomplete-result-in-bootstrap-modal-dialog */
.ui-autocomplete {
    z-index: 1051 !important;
}

Works wonders! :)

Rudi Wijaya
  • 872
  • 1
  • 10
  • 25
  • If this doesn't work for you it might be because .ui-autocomplete doesn't exist. Instead combine it with the accepted answer and do a .pac-container { z-index: 1051; } which is a lot cleaner than the expected answer and affects much less of your other code – Pompey Sep 14 '14 at 04:22
13

Worked with Bootstrap 3:

.pac-container {
  z-index: 1040 !important;
}
Pedro Casado
  • 1,705
  • 1
  • 21
  • 43
6

In my scenario the .pac-container 's z-index value will be init and override to 1000, even I set in CSS. (possibly by google API?)

my dirty fix

$('#myModal').on('shown', function() {
     $(".pac-container").css("z-index", $("#myModal").css("z-index"));
}
vincentlcy
  • 1,157
  • 2
  • 17
  • 19
6

I have spend 2,3 hours to just digging out the error with google places API drop down z index. Finally I have found this. Just paste this code at top of your JS script and update the input id name.

var pacContainerInitialized = false;
$("#inputField").keypress(function() {
  if (!pacContainerInitialized) {
    $(".pac-container").css("z-index", "9999");
    pacContainerInitialized = true;
  }
});

Full reference link. https://groups.google.com/forum/#!topic/google-maps-js-api-v3/GZX0ynQNn1M Thanks to Gautam.

Rastalamm
  • 1,712
  • 3
  • 23
  • 32
Nasir ali
  • 61
  • 1
  • 1
4

In general, you can just bump up the .pac-container z-index to anything above 1050 and you won't need the other CSS overrides.

I discovered that this problem also exists for jQuery UI dialogs. So in case it ends up being helpful to anyone else, here's a quick reference for where the Bootstrap/jQuery UI modals live in the z-plane:

jQuery UI Dialog - z-index: 1001
Bootstrap Modal - z-index: 1050
Ryan Shih
  • 379
  • 1
  • 5
2

This worked for me.

                   var pacContainerInitialized = false; 
                    $('#inputField').keypress(function() { 
                            if (!pacContainerInitialized) { 
                                    $('.pac-container').css('z-index','9999'); 
                                    pacContainerInitialized = true; 
                            } 
                    }); 
Coder
  • 845
  • 1
  • 10
  • 20
0

If you are using Visual Studio, on your style.css page set the z-index for .modal to 20.

e.g

.modal {
    z-index: 20 !important;
}
Finrod
  • 2,425
  • 4
  • 28
  • 38
0

Bootstrap 5:

.pac-container {
    z-index: 1060 !important;
}
Harpal
  • 1,729
  • 17
  • 18