Bootstrap模式对话框中的Google Maps自动完成结果


73

我在Twitter Bootstrap模态对话框中有一个Google Maps自动完成输入字段,并且不显示自动完成结果。但是,如果按向下箭头键,它将选择下一个自动完成结果,因此自动完成代码似乎正常工作,只是结果显示不正确。也许它隐藏在模态对话框的后面?

这是屏幕截图:

在自动完成字段中输入内容无济于事 在自动完成字段中输入内容无济于事

按向下箭头键可获得第一个结果 按向下箭头键可获得第一个结果

和代码:

<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>

我已经尽力解决了这个问题,但是由于我不知道自动完成结果的html&css(inspect元素什么也没有),所以我现在迷失了。有帮助吗?

之前谢谢!


2
我取得了一些进展,但遇到了困难。我将解释我发现的尝试帮助他人解决您问题的方法。我重新排列了文本框,看起来自动完成不仅不仅位于模态之后,而且还位于灰显区域的后面(请检查此演示)jsfiddle.net/Y4WgX/embedded/result 更改z索引无效。我还了解到建议位于pac-container类的div中,因此我将其颜色更改为绿色以进行演示。
蒂娜(Tina CG)Hoehr

Answers:


121

问题z-index出在.modal

使用此CSS标记:

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

您也可以在这里查看最终演示

ps:感谢@lilina在jsfiddle.com上的演示


为什么这一切都是必要的?我知道是,但是为什么呢?同样,这对我来说模态也很重要,并且引导程序静态导航栏现在就在它上面。备择方案?
Marc M.

@马克 您正在使用什么版本的引导程序?我认为如果您提出一个完整的问题详细信息的新问题会更好。
2014年

9
我发现这将我的情态置于我的导航栏后面,看起来不正确。尝试将.pac-container的z索引更改为1050
Jeff Finn

@JeffFinn好的,您可以打开一个新问题,我可以尝试帮助您,您必须检查这是否是Bootstrap 2,是否使用相同的版本?如果是这种情况,我看不出拒绝答案的原因,因为您看到它对一些人有所帮助。
2014年

4
.pac-container {z-index:1070; }是您唯一需要的东西。如果您的页面中有.navbars,则它们具有不同的z-Index而不是更改您的所有引导z-index可能只是在GMaps上执行z-index。GeoComplete.js也会发生此问题
user706001

61
.pac-container {
    z-index: 1051 !important;
}

为我做了

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


作品!您可能需要根据CSS来增加z-index值。
eyal_katz '16

这对我在primefaces上起作用,我的地图是这样的:<p:panel style =“ border:none!important; height:450px;”> <div id =“ map” style =“ width:100%; height: 100%“> </ div> </ p:panel>并回答了该错误。
伊莱贾科梅

我需要将其更改为9999,但它可以工作。(Bootstrap 4)
查理

如果您想像我一样想知道,则.pac-container是Places AutoComplete的容器,而不是与引导程序有关的任何容器。我的模态不是来自Twitter Bootstrap,所以我很难理解哪个CSS真正重要(其他答案包含多个CSS部分)。
泰勒·科利尔

在标题和侧边菜单上仍能完美工作,模态和背景,谢谢
Louwki

15

引导.modal z-index程序默认为1050。

jQuery UI.ui-autocomplete z-index默认为3。

因此,将其放在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;
}

创造奇迹!:)


如果这对您不起作用,可能是因为.ui-autocomplete不存在。取而代之的是将其与接受的答案结合起来,然后创建一个.pac-container {z-index:1051; }比预期的答案干净得多,并且对您其他代码的影响也较小
Pompey


6

在我的方案中,即使我在CSS中设置,.pac-container的z-index值也会被初始化并覆盖为1000。(可能是通过Google API?)

我的肮脏修复

$('#myModal').on('shown', function() {
     $(".pac-container").css("z-index", $("#myModal").css("z-index"));
}

这有帮助,尽管在较新的Bootstrap中,事件为“ shown.bs.modal”。
Arunas

4

通常,您可以将.pac-container z-index增大到1050以上,并且不需要其他CSS替代。

我发现jQuery UI对话框也存在此问题。因此,以防最终对其他人有所帮助,以下是有关Bootstrap / jQuery UI模式在z平面中的位置的快速参考:

jQuery UI Dialog - z-index: 1001
Bootstrap Modal - z-index: 1050

3

我花了2,3个小时才用Google Places API下拉z索引找出错误。终于我找到了。只需将此代码粘贴到JS脚本顶部,然后更新输入的ID名称。

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

完整的参考链接。 https://groups.google.com/forum/#!topic/google-maps-js-api-v3/GZX0ynQNn1M 感谢Gautam。


2

这对我有用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.