Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有两个相应信息窗口的双地图标记_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

Javascript 具有两个相应信息窗口的双地图标记

Javascript 具有两个相应信息窗口的双地图标记,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我有两个谷歌地图自动完成两个位置搜索输入。我还能够管理这两个地方的2个标记。但我也有一个for,需要输入名称(用户名)。该名称应显示在两个标记的信息窗口上。但一个标记显示信息窗口,另一个标记不显示窗口。显示信息窗口的标记不显示用户名 下面是我的HTML代码 下面是截图 这里有一个可能的修复方法。在autocomplete.addListener回调的末尾,添加以下行: var username = document.getElementById('name').value; infowindow

我有两个谷歌地图自动完成两个位置搜索输入。我还能够管理这两个地方的2个标记。但我也有一个for,需要输入名称(用户名)。该名称应显示在两个标记的信息窗口上。但一个标记显示信息窗口,另一个标记不显示窗口。显示信息窗口的标记不显示用户名

下面是我的HTML代码 下面是截图
这里有一个可能的修复方法。在
autocomplete.addListener
回调的末尾,添加以下行:

var username = document.getElementById('name').value;
infowindowContent.children['place-name'].textContent = username;
infowindow.setContent(infowindowContent.innerHTML);
infowindow.open(map, marker);
如果您输入一个名称,然后搜索一个位置,这将起作用


这是一个。

在用户输入信息之前,您正在填充
username
变量

解决方案:需要时获取(在自动完成回调函数中):

html,
身体,
#地图{
身高:100%;
宽度:100%;
边际:0px;
填充:0px
}




在看到大量重复的代码后,我的处理方式有点不同,尤其是当自动完成的最终功能或多或少相同时。为了实现这一点,我删除了许多分配给DOM元素的ID属性,而是选择了
dataset
属性,这些属性可以使用
querySelector(All)
方法中的任何一种作为目标

我在整个过程中添加了几条注释-此方法也可以用于两个以上的位置输入字段,只需在正确的父容器
pac容器
中添加一个新的此类输入元素,并分配具有相关信息窗口内容的类似属性等

无论如何,它在一个无聊的星期天度过了一段时间,希望它有用

<!doctype html>
<html>
    <head>
        <title>Google Maps - two autocomplete</title>
        <meta charset='utf-8' />
        <script async defer src='//maps.googleapis.com/maps/api/js?key=AIzaSyCqa9_oFYP4yorGy17BILIALjiqKXByoeE&libraries=places&callback=initMap'></script>
        <script>
            function initMap(){
                /* some variables */
                var autocomplete;
                var infowindow;
                var marker;
                var options;
                var place;
                var obj;
                var url;
                var img;


                /* DOM elements */
                var oDiv     = document.getElementById('map');
                var oCard    = document.getElementById('pac-card');
                var oColInput= document.querySelectorAll('div#pac-container > input[data-type]');
                var oUsername= document.getElementById('name');



                /* Map initial config */
                options={
                    center: {
                        lat: 59.325,
                        lng: 18.070
                    },
                    zoom: 9                 
                };
                /* the map */
                var map = new google.maps.Map( oDiv, options );

                /*
                    Define objects associated with each of the input elements
                    used for places.

                    Each object created has a reference stored in `obj` which is
                    used as a bound object to the event listener so that each item
                    can be accessed within the listener using `this`
                */
                Array.prototype.slice.call( oColInput ).forEach( function( input ){
                    /* options for the autocomplete service */
                    options={
                        strictBounds: false
                    };

                    /* create the autocomplete object */
                    autocomplete = new google.maps.places.Autocomplete( input, options );
                    autocomplete.bindTo( 'bounds', map );

                    /* create the infowindow bound to this autocomplete object */
                    infowindow = new google.maps.InfoWindow( { maxWidth:320, disableAutoPan:false } );
                    infowindow.setContent( document.querySelector('div.iwin[ data-type="'+input.dataset.type+'" ]') );

                    /* ensure hidden content from infowindow does not alter layout */
                    google.maps.event.addListener( infowindow, 'closeclick', function( event ){
                        this.getContent().style.display='none';
                    }.bind( infowindow ));

                    /* add a marker bound to the autocomplete service */
                    marker=new google.maps.Marker({
                        map: map,
                        position: {
                            lat: parseFloat( input.dataset.lat ),
                            lng: parseFloat( input.dataset.lng )
                        },
                        anchorPoint: new google.maps.Point(0, -29)
                    });

                    /* Marker events */
                    google.maps.event.addListener( marker, 'click', function(e){
                        this.open( map );
                        this.getContent().style.display='block';
                        this.setPosition( e.latLng );
                        this.setOptions( { pixelOffset:new google.maps.Size(0,-32) } );
                    }.bind( infowindow ) );


                    /* 
                        add a reference to each object to our binding object used below
                    */
                    obj={
                        'input':input,
                        'type':input.dataset.type,
                        'marker':marker,
                        'autocomplete':autocomplete,
                        'infowindow':infowindow
                    }



                    /* Listen for changes and do some cool things */
                    autocomplete.addListener('place_changed',function(){
                        /* must have a username value to continue as it should appear on the infowindow */
                        if( oUsername.value=='' ){

                            oUsername.classList.add('warn');

                            setTimeout( function(){
                                this.input.value='';
                                oUsername.classList.remove('warn');
                            }.bind( this ),1500);

                            return;
                        }
                        /* reset existing marker if it exists */
                        this.marker.setVisible( false );
                        this.marker.title='';

                        var oWin=this.infowindow.getContent();
                            oWin.style.display='block';

                        place = this.autocomplete.getPlace();
                        console.info( place );

                        /* find suitable hidden inputs within form - using span as parent */
                        var oSpan=document.querySelector('form > span[ id="'+this.type+'" ]');
                            oSpan.querySelector('input[ data-id="name" ]').value=this.input.value=='' ? '' : place.name;
                            oSpan.querySelector('input[ data-id="lat" ]').value=this.input.value=='' ? '' : place.geometry.location.lat();
                            oSpan.querySelector('input[ data-id="lng" ]').value=this.input.value=='' ? '' : place.geometry.location.lng();

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

                        this.marker.setPosition( place.geometry.location );
                        this.marker.setVisible( true );
                        this.marker.title=place.name;




                        /* find infowindow content & append new values */
                        oWin.querySelector('span[data-id="user-name"]').innerHTML=oUsername.value;
                        oWin.querySelector('span[data-id="place-name"]').innerHTML=place.name;
                        oWin.querySelector('span[data-id="place-address"]').innerHTML=place.formatted_address;

                        if( oWin.querySelector( 'a[data-id="'+this.type+'"]' ) ) oWin.removeChild( oWin.querySelector( 'a[data-id="'+this.type+'"]' ) );

                        var a=document.createElement('a');
                            a.dataset.id=this.type;
                            a.innerHTML='more...';
                            a.target='_blank';
                            a.href=place.url;

                        oWin.appendChild( a );

                        /* open the infowindow and show new content */
                        this.infowindow.open( map, this.marker );
                    }.bind( obj ));/* bind all the objects */
                });
            }
        </script>
        <style>
            html, body, #map {
                height: 100%;
                height:100vh;
                margin: 0px;
                padding: 0px
            }
            #map{
                width:800px;
                height:600px;
                float:none;
                margin:auto;
            }
            .iwin{/* hidden infowindow content elements */
                display:none;
                width:320px;
                height:240px;
                padding:1rem;
                border:1px solid gray;
                border-radius:1rem;
                box-sizing:border-box;
                font-family:calibri,verdana,arial;
            }
            .iwin > img{
                display:inline-block;
                clear:none;
                margin:0.5rem;
                float:left;
                outline:1px dotted rgba(133,133,133,0.25);
                padding:0.1rem;
                min-width:80px;
                min-height:120px;
            }
            .iwin > span{
                float:left;
                min-width:51%;
                margin:0 auto 0.25rem auto;
                display:inline-block;
                clear:right;
                color:gray;
            }
            .iwin > span[data-id='user-name']{
                font-size:1.25rem;
                font-weight:bold;
                color:green;
            }
            .iwin > span[data-id='place-name']{
                font-size:1rem;
            }
            .iwin > span[data-id='place-address']{
                font-size:0.9rem;
            }
            .iwin > a{
                float:right;
                margin:1rem auto;
                font-size:0.75rem;
            }







            #pac-card{
                width:800px;
                float:none;
                margin:auto;
                padding:1rem;
                border:1px solid gray;
                box-sizing:border-box;
                display:flex;
                justify-content:space-around;
            }
            form{
                display:inline-block;
                clear:none;
                width:100%;
            }

            #pac-card > div {
                box-sizing:border-box;
                background:white;
                clear:none;
                margin:0;
                float:none;
                display:block;
            }
            input[type='text'],
            input[type='submit']{
                padding:1rem;
            }
            input[type='text'],
            #name{
                border:1px solid gray;
            }
            .warn{
                border:1px solid red!important;
                background:rgba(255,0,0,0.25);
                color:white;
            }
            input[value]:not([value=""]) + span:before{
                color:green;
                background:transparent;

                padding:0.25rem;
                clear:none;
                content:'L';
                display:inline-block;

                font-family: arial;
                font-weight:bold;
                font-size:1.5rem;

                -ms-transform: scaleX(-1) rotate(-35deg);
                -webkit-transform: scaleX(-1) rotate(-35deg);
                transform: scaleX(-1) rotate(-35deg);

                z-index:2;
                position:relative;
                left:-28rem!important;
            }

            input[type='submit']{
                text-transform:uppercase;
            }
        </style>
    </head>
    <body>
        <!-- // more or less original html content - less ID attributes but extensive use of dataset attributes // -->


        <div class='pac-card' id='pac-card'>
          <div id='pac-container'>
            <input data-type='stateside' data-lat='59.325' data-lng='18.070' type='text' placeholder='StateSide Guess' value='' />
            <input data-type='foreign' data-lat='50.325' data-lng='24.070' type='text' placeholder='Foreign Guess' value='' />
          </div>
          <div>
            <form class='guess-submit' style='text-align: center'>

                <span id='stateside'>
                    <input type='hidden' data-id='name' name='state' value='' /><span></span>
                    <input type='hidden' data-id='lat' name='stateLat' value='' />
                    <input type='hidden' data-id='lng' name='stateLng' value='' />
                </span>

                <span id='foreign'>
                    <input type='hidden' data-id='name' name='foreign' value='' /><span></span>
                    <input type='hidden' data-id='lat' name='foreignLat' value='' />
                    <input type='hidden' data-id='lng' name='foreignLng' value='' />
                </span>

                <input type='text' id='name' name='name' placeholder='Your Name' />
                <input type='submit' id='submit' class='btn btn-primary' value='submit' />
            </form>  
          </div>
        </div>


        <div id='map'></div>


        <!-- hidden elements - infowindow contents -->
        <div id='win_1' class='iwin' data-type='stateside'>
          <img src='' width='16' height='16' />
          <span data-id='user-name'  class='user'></span>
          <span data-id='place-name'  class='title'></span>
          <br />
          <span data-id='place-address'></span>
        </div>

        <div id='win_2' class='iwin' data-type='foreign'>
          <img src='' width='16' height='16' />
          <span data-id='user-name'  class='user'></span>
          <span data-id='place-name' class='title'></span>
          <br />
          <span data-id='place-address'></span>
        </div>


        <!-- // // -->
    </body>
</html>

谷歌地图-两个自动完成
函数initMap(){
/*一些变量*/
var自动完成;
var信息窗口;
var标记;
var期权;
var place;
var-obj;
var-url;
var-img;
/*DOM元素*/
var oDiv=document.getElementById('map');
var-oCard=document.getElementById('pac-card');
var oColInput=document.querySelectorAll('div#pac container>input[data type]”);
var oUsername=document.getElementById('name');
/*映射初始配置*/
选择权={
中心:{
拉脱维亚:59.325,
液化天然气:18.070
},
缩放:9
};
/*地图*/
var map=newgoogle.maps.map(oDiv,选项);
/*
定义与每个输入元素关联的对象
用于场所。
创建的每个对象都有一个存储在'obj'中的引用,它是
用作事件侦听器的绑定对象,以便每个项
可以使用“this”在侦听器中访问`
*/
Array.prototype.slice.call(oColInput.forEach)(函数(输入){
/*自动完成服务的选项*/
选择权={
严格限制:错误
};
/*创建自动完成对象*/
autocomplete=newgoogle.maps.places.autocomplete(输入,选项);
自动完成。bindTo('bounds',map);
/*创建绑定到此自动完成对象的信息窗口*/
infowindow=newgoogle.maps.infowindow({maxWidth:320,disableAutoPan:false});
infowindow.setContent(document.querySelector('div.iwin[data type=“”+input.dataset.type+”);
/*确保信息窗口中的隐藏内容不会改变布局*/
google.maps.event.addListener(信息窗口,'closeclick',函数(事件){
this.getContent().style.display='none';
}.bind(infowindow));
/*添加绑定到自动完成服务的标记*/
marker=新的google.maps.marker({
地图:地图,
职位:{
lat:parseFloat(input.dataset.lat),
lng:parseFloat(input.dataset.lng)
},
主播点:新google.maps.Point(0,-29)
});
/*标记事件*/
google.maps.event.addListener(标记,'click',函数(e){
这个。打开(地图);
this.getContent().style.display='block';
此设置位置(如板条);
setOptions({pixelcoffset:new google.maps.Size(0,-32)});
}.bind(infowindow));
/* 
将每个对象的引用添加到下面使用的绑定对象
*/
obj={
“输入”:输入,
“类型”:input.dataset.type,
“标记”:标记,
“自动完成”:自动完成,
“infowindow”:infowindow
}
/*倾听变化,做一些很酷的事情*/
autocomplete.addListener('place\u changed',function(){
/*必须具有用户名值才能继续,因为它应该显示在信息窗口上*/
if(userName.value==''){
var username = document.getElementById('name').value;
infowindowContent.children['place-name'].textContent = username;
infowindow.setContent(infowindowContent.innerHTML);
infowindow.open(map, marker);
autocomplete.addListener('place_changed', function() {
    infowindow.close();
    marker.setVisible(false);
    var place = autocomplete.getPlace();
    document.getElementById('state').value = place.name;
    document.getElementById('stateLat').value = place.geometry.location.lat();
    document.getElementById('stateLng').value = place.geometry.location.lng();

    if (place.geometry.viewport) {
        map.fitBounds(place.geometry.viewport);
    } else {
        map.setCenter(place.geometry.location);
        map.setZoom(9);
    }
    marker.setPosition(place.geometry.location);
    marker.setVisible(true);
    username = document.getElementById('name').value;  // <============= ** get it here **
    infowindowContent.children['place-name'].textContent = username;
    infowindow.open(map, marker);
});
<!doctype html>
<html>
    <head>
        <title>Google Maps - two autocomplete</title>
        <meta charset='utf-8' />
        <script async defer src='//maps.googleapis.com/maps/api/js?key=AIzaSyCqa9_oFYP4yorGy17BILIALjiqKXByoeE&libraries=places&callback=initMap'></script>
        <script>
            function initMap(){
                /* some variables */
                var autocomplete;
                var infowindow;
                var marker;
                var options;
                var place;
                var obj;
                var url;
                var img;


                /* DOM elements */
                var oDiv     = document.getElementById('map');
                var oCard    = document.getElementById('pac-card');
                var oColInput= document.querySelectorAll('div#pac-container > input[data-type]');
                var oUsername= document.getElementById('name');



                /* Map initial config */
                options={
                    center: {
                        lat: 59.325,
                        lng: 18.070
                    },
                    zoom: 9                 
                };
                /* the map */
                var map = new google.maps.Map( oDiv, options );

                /*
                    Define objects associated with each of the input elements
                    used for places.

                    Each object created has a reference stored in `obj` which is
                    used as a bound object to the event listener so that each item
                    can be accessed within the listener using `this`
                */
                Array.prototype.slice.call( oColInput ).forEach( function( input ){
                    /* options for the autocomplete service */
                    options={
                        strictBounds: false
                    };

                    /* create the autocomplete object */
                    autocomplete = new google.maps.places.Autocomplete( input, options );
                    autocomplete.bindTo( 'bounds', map );

                    /* create the infowindow bound to this autocomplete object */
                    infowindow = new google.maps.InfoWindow( { maxWidth:320, disableAutoPan:false } );
                    infowindow.setContent( document.querySelector('div.iwin[ data-type="'+input.dataset.type+'" ]') );

                    /* ensure hidden content from infowindow does not alter layout */
                    google.maps.event.addListener( infowindow, 'closeclick', function( event ){
                        this.getContent().style.display='none';
                    }.bind( infowindow ));

                    /* add a marker bound to the autocomplete service */
                    marker=new google.maps.Marker({
                        map: map,
                        position: {
                            lat: parseFloat( input.dataset.lat ),
                            lng: parseFloat( input.dataset.lng )
                        },
                        anchorPoint: new google.maps.Point(0, -29)
                    });

                    /* Marker events */
                    google.maps.event.addListener( marker, 'click', function(e){
                        this.open( map );
                        this.getContent().style.display='block';
                        this.setPosition( e.latLng );
                        this.setOptions( { pixelOffset:new google.maps.Size(0,-32) } );
                    }.bind( infowindow ) );


                    /* 
                        add a reference to each object to our binding object used below
                    */
                    obj={
                        'input':input,
                        'type':input.dataset.type,
                        'marker':marker,
                        'autocomplete':autocomplete,
                        'infowindow':infowindow
                    }



                    /* Listen for changes and do some cool things */
                    autocomplete.addListener('place_changed',function(){
                        /* must have a username value to continue as it should appear on the infowindow */
                        if( oUsername.value=='' ){

                            oUsername.classList.add('warn');

                            setTimeout( function(){
                                this.input.value='';
                                oUsername.classList.remove('warn');
                            }.bind( this ),1500);

                            return;
                        }
                        /* reset existing marker if it exists */
                        this.marker.setVisible( false );
                        this.marker.title='';

                        var oWin=this.infowindow.getContent();
                            oWin.style.display='block';

                        place = this.autocomplete.getPlace();
                        console.info( place );

                        /* find suitable hidden inputs within form - using span as parent */
                        var oSpan=document.querySelector('form > span[ id="'+this.type+'" ]');
                            oSpan.querySelector('input[ data-id="name" ]').value=this.input.value=='' ? '' : place.name;
                            oSpan.querySelector('input[ data-id="lat" ]').value=this.input.value=='' ? '' : place.geometry.location.lat();
                            oSpan.querySelector('input[ data-id="lng" ]').value=this.input.value=='' ? '' : place.geometry.location.lng();

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

                        this.marker.setPosition( place.geometry.location );
                        this.marker.setVisible( true );
                        this.marker.title=place.name;




                        /* find infowindow content & append new values */
                        oWin.querySelector('span[data-id="user-name"]').innerHTML=oUsername.value;
                        oWin.querySelector('span[data-id="place-name"]').innerHTML=place.name;
                        oWin.querySelector('span[data-id="place-address"]').innerHTML=place.formatted_address;

                        if( oWin.querySelector( 'a[data-id="'+this.type+'"]' ) ) oWin.removeChild( oWin.querySelector( 'a[data-id="'+this.type+'"]' ) );

                        var a=document.createElement('a');
                            a.dataset.id=this.type;
                            a.innerHTML='more...';
                            a.target='_blank';
                            a.href=place.url;

                        oWin.appendChild( a );

                        /* open the infowindow and show new content */
                        this.infowindow.open( map, this.marker );
                    }.bind( obj ));/* bind all the objects */
                });
            }
        </script>
        <style>
            html, body, #map {
                height: 100%;
                height:100vh;
                margin: 0px;
                padding: 0px
            }
            #map{
                width:800px;
                height:600px;
                float:none;
                margin:auto;
            }
            .iwin{/* hidden infowindow content elements */
                display:none;
                width:320px;
                height:240px;
                padding:1rem;
                border:1px solid gray;
                border-radius:1rem;
                box-sizing:border-box;
                font-family:calibri,verdana,arial;
            }
            .iwin > img{
                display:inline-block;
                clear:none;
                margin:0.5rem;
                float:left;
                outline:1px dotted rgba(133,133,133,0.25);
                padding:0.1rem;
                min-width:80px;
                min-height:120px;
            }
            .iwin > span{
                float:left;
                min-width:51%;
                margin:0 auto 0.25rem auto;
                display:inline-block;
                clear:right;
                color:gray;
            }
            .iwin > span[data-id='user-name']{
                font-size:1.25rem;
                font-weight:bold;
                color:green;
            }
            .iwin > span[data-id='place-name']{
                font-size:1rem;
            }
            .iwin > span[data-id='place-address']{
                font-size:0.9rem;
            }
            .iwin > a{
                float:right;
                margin:1rem auto;
                font-size:0.75rem;
            }







            #pac-card{
                width:800px;
                float:none;
                margin:auto;
                padding:1rem;
                border:1px solid gray;
                box-sizing:border-box;
                display:flex;
                justify-content:space-around;
            }
            form{
                display:inline-block;
                clear:none;
                width:100%;
            }

            #pac-card > div {
                box-sizing:border-box;
                background:white;
                clear:none;
                margin:0;
                float:none;
                display:block;
            }
            input[type='text'],
            input[type='submit']{
                padding:1rem;
            }
            input[type='text'],
            #name{
                border:1px solid gray;
            }
            .warn{
                border:1px solid red!important;
                background:rgba(255,0,0,0.25);
                color:white;
            }
            input[value]:not([value=""]) + span:before{
                color:green;
                background:transparent;

                padding:0.25rem;
                clear:none;
                content:'L';
                display:inline-block;

                font-family: arial;
                font-weight:bold;
                font-size:1.5rem;

                -ms-transform: scaleX(-1) rotate(-35deg);
                -webkit-transform: scaleX(-1) rotate(-35deg);
                transform: scaleX(-1) rotate(-35deg);

                z-index:2;
                position:relative;
                left:-28rem!important;
            }

            input[type='submit']{
                text-transform:uppercase;
            }
        </style>
    </head>
    <body>
        <!-- // more or less original html content - less ID attributes but extensive use of dataset attributes // -->


        <div class='pac-card' id='pac-card'>
          <div id='pac-container'>
            <input data-type='stateside' data-lat='59.325' data-lng='18.070' type='text' placeholder='StateSide Guess' value='' />
            <input data-type='foreign' data-lat='50.325' data-lng='24.070' type='text' placeholder='Foreign Guess' value='' />
          </div>
          <div>
            <form class='guess-submit' style='text-align: center'>

                <span id='stateside'>
                    <input type='hidden' data-id='name' name='state' value='' /><span></span>
                    <input type='hidden' data-id='lat' name='stateLat' value='' />
                    <input type='hidden' data-id='lng' name='stateLng' value='' />
                </span>

                <span id='foreign'>
                    <input type='hidden' data-id='name' name='foreign' value='' /><span></span>
                    <input type='hidden' data-id='lat' name='foreignLat' value='' />
                    <input type='hidden' data-id='lng' name='foreignLng' value='' />
                </span>

                <input type='text' id='name' name='name' placeholder='Your Name' />
                <input type='submit' id='submit' class='btn btn-primary' value='submit' />
            </form>  
          </div>
        </div>


        <div id='map'></div>


        <!-- hidden elements - infowindow contents -->
        <div id='win_1' class='iwin' data-type='stateside'>
          <img src='' width='16' height='16' />
          <span data-id='user-name'  class='user'></span>
          <span data-id='place-name'  class='title'></span>
          <br />
          <span data-id='place-address'></span>
        </div>

        <div id='win_2' class='iwin' data-type='foreign'>
          <img src='' width='16' height='16' />
          <span data-id='user-name'  class='user'></span>
          <span data-id='place-name' class='title'></span>
          <br />
          <span data-id='place-address'></span>
        </div>


        <!-- // // -->
    </body>
</html>