Элемент AdvancedPlaceSearchElement — это HTML-элемент, который отображает результаты поиска мест в виде списка. Существует два способа настройки элемента gmp-advanced-place-search :
- Для поиска мест определенного типа в заданной области используйте запрос поиска поблизости , чтобы отобразить результаты поиска с помощью элемента
PlaceNearbySearchRequestElement. - Для поиска мест в заданной области на основе текстового запроса используйте поиск по текстовому запросу , чтобы отобразить результаты поиска с помощью элемента
PlaceTextSearchRequestElement.
Как поиск поблизости, так и текстовый поиск предлагают одинаковые расширенные функции , включая настройку кнопок действий, фильтрацию отзывов и медиафайлов, настройку атрибуции мест, а также обработку выбора мест и ошибок.
Поиск запроса поблизости
Выберите тип населенного пункта из меню, чтобы просмотреть результаты поиска поблизости для этого типа населенного пункта.
Поиск поблизости в основном настроен на поиск по типу места и местоположению, а результаты могут быть ранжированы по расстоянию или популярности с помощью свойства rankPreference . Дополнительные сведения см. в справочной документации класса PlaceNearbySearchRequestElement .
В этом примере элемент расширенного поиска мест отображается в ответ на поиск поблизости с выбранным пользователем типом места. Также отображается элемент AdvancedPlaceDetailsCompactElement для выбранного места.
Чтобы добавить элемент расширенного поиска мест на карту, добавьте на HTML-страницу элемент gmp-advanced-place-search с вложенным элементом gmp-place-nearby-search-request .
<gmp-advanced-place-search selectable>
<!-- Nearby search requests require a location restriction to return results. Often set programmatically. -->
<gmp-place-nearby-search-request max-result-count="5"></gmp-place-nearby-search-request>
<template slot="details-item">
<gmp-place-all-content></gmp-place-all-content>
</template>
</gmp-advanced-place-search>См. полный пример кода.
Машинопись
// Query selectors for various elements in the HTML file. const map = document.querySelector<google.maps.MapElement>('gmp-map')!; const placeSearch = document.querySelector< HTMLElement & { places?: google.maps.places.Place[] } >('gmp-advanced-place-search')!; const placeSearchQuery = document.querySelector< HTMLElement & { locationRestriction?: { center: google.maps.LatLng | google.maps.LatLngLiteral; radius: number; }; includedTypes?: string[]; } >('gmp-place-nearby-search-request')!; const placeDetails = document.querySelector<HTMLElement>( 'gmp-advanced-place-details-compact' )!; const placeRequest = document.querySelector< HTMLElement & { place?: google.maps.places.Place } >('gmp-place-details-place-request')!; const typeSelect = document.querySelector<HTMLSelectElement>('.type-select')!; // Global variables for the map, markers, and info window. const markers = new Map<string, google.maps.marker.AdvancedMarkerElement>(); let infoWindow: google.maps.InfoWindow; // The init function is called when the page loads. async function init(): Promise<void> { // Import the necessary libraries from the Google Maps API. const [{ InfoWindow }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), ]); // Create a new info window and set its content to the place details element. placeDetails.remove(); // Hide the place details element because it is not needed until the info window opens infoWindow = new InfoWindow({ content: placeDetails, ariaLabel: 'Place Details', }); // Set the map options. map.innerMap.setOptions({ clickableIcons: false, mapTypeControl: false, streetViewControl: false, }); // Add event listeners to the type select and place search elements. typeSelect.addEventListener('change', () => { searchPlaces(); }); placeSearch.addEventListener('gmp-select', (event: Event) => { const place = (event as Event & { place?: google.maps.places.Place }) .place; if (place?.id) { markers.get(place.id)?.click(); } }); placeSearch.addEventListener('gmp-load', () => { void addMarkers(); }); searchPlaces(); } // The searchPlaces function is called when the user changes the type select or when the page loads. function searchPlaces() { // Close the info window and clear the markers. infoWindow.close(); for (const marker of markers.values()) { marker.remove(); } markers.clear(); // Set the place search query and add an event listener to the place search element. if (typeSelect.value) { const center = map.center!; placeSearchQuery.locationRestriction = { center, radius: 50000, // 50km radius }; placeSearchQuery.includedTypes = [typeSelect.value]; } } // The addMarkers function is called when the place search element loads. async function addMarkers() { // Import the necessary libraries from the Google Maps API. const [{ AdvancedMarkerElement }, { LatLngBounds }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); if (!placeSearch.places || placeSearch.places.length === 0) { return; } for (const place of placeSearch.places) { if (!place.location) continue; const marker = new AdvancedMarkerElement({ map: map.innerMap, position: place.location, collisionBehavior: 'REQUIRED_AND_HIDES_OPTIONAL', }); markers.set(place.id, marker); bounds.extend(place.location); marker.addListener('click', () => { placeRequest.place = place; infoWindow.open(map.innerMap, marker); }); } map.innerMap.fitBounds(bounds); } void init();
JavaScript
// Query selectors for various elements in the HTML file. const map = document.querySelector('gmp-map'); const placeSearch = document.querySelector('gmp-advanced-place-search'); const placeSearchQuery = document.querySelector( 'gmp-place-nearby-search-request' ); const placeDetails = document.querySelector( 'gmp-advanced-place-details-compact' ); const placeRequest = document.querySelector('gmp-place-details-place-request'); const typeSelect = document.querySelector('.type-select'); // Global variables for the map, markers, and info window. const markers = new Map(); let infoWindow; // The init function is called when the page loads. async function init() { // Import the necessary libraries from the Google Maps API. const [{ InfoWindow }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), ]); // Create a new info window and set its content to the place details element. placeDetails.remove(); // Hide the place details element because it is not needed until the info window opens infoWindow = new InfoWindow({ content: placeDetails, ariaLabel: 'Place Details', }); // Set the map options. map.innerMap.setOptions({ clickableIcons: false, mapTypeControl: false, streetViewControl: false, }); // Add event listeners to the type select and place search elements. typeSelect.addEventListener('change', () => { searchPlaces(); }); placeSearch.addEventListener('gmp-select', (event) => { const place = event.place; if (place?.id) { markers.get(place.id)?.click(); } }); placeSearch.addEventListener('gmp-load', () => { void addMarkers(); }); searchPlaces(); } // The searchPlaces function is called when the user changes the type select or when the page loads. function searchPlaces() { // Close the info window and clear the markers. infoWindow.close(); for (const marker of markers.values()) { marker.remove(); } markers.clear(); // Set the place search query and add an event listener to the place search element. if (typeSelect.value) { const center = map.center; placeSearchQuery.locationRestriction = { center, radius: 50000, // 50km radius }; placeSearchQuery.includedTypes = [typeSelect.value]; } } // The addMarkers function is called when the place search element loads. async function addMarkers() { // Import the necessary libraries from the Google Maps API. const [{ AdvancedMarkerElement }, { LatLngBounds }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); if (!placeSearch.places || placeSearch.places.length === 0) { return; } for (const place of placeSearch.places) { if (!place.location) continue; const marker = new AdvancedMarkerElement({ map: map.innerMap, position: place.location, collisionBehavior: 'REQUIRED_AND_HIDES_OPTIONAL', }); markers.set(place.id, marker); bounds.extend(place.location); marker.addListener('click', () => { placeRequest.place = place; infoWindow.open(map.innerMap, marker); }); } map.innerMap.fitBounds(bounds); } void init();
CSS
html, body { height: 100%; margin: 0; } body { display: flex; flex-direction: column; font-family: Arial, Helvetica, sans-serif; } .container { display: flex; height: 100vh; width: 100%; } gmp-map { flex-grow: 1; } .ui-panel { width: 400px; margin-left: 20px; margin-top: 10px; overflow-y: auto; font-family: Arial, Helvetica, sans-serif; } .list-container { display: flex; flex-direction: column; } gmp-place-search { width: 100%; margin: 0; border: none; color-scheme: light; }
HTML
<!doctype html>
<html>
<head>
<title>Place Search Nearby with Google Maps</title>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="module" src="./index.js"></script>
<script>
// prettier-ignore
(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
key: "GOOGLE_MAPS_API_KEY",
v: "beta"
});
</script>
</head>
<body>
<div class="container">
<!-- map-id is required to use advanced markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
<gmp-map center="-37.813,144.963" zoom="16" map-id="DEMO_MAP_ID">
</gmp-map>
<div class="ui-panel">
<div class="controls">
<label for="type-select">
Select a place type:
<select id="type-select" class="type-select">
<option value="restaurant">Restaurant</option>
<option value="cafe" selected>Cafe</option>
<option value="electric_vehicle_charging_station">
EV charging station
</option>
</select>
</label>
</div>
<div class="list-container">
<gmp-advanced-place-search selectable>
<gmp-place-all-content></gmp-place-all-content>
<gmp-place-nearby-search-request
max-result-count="5"></gmp-place-nearby-search-request>
</gmp-advanced-place-search>
</div>
</div>
</div>
<!--
The gmp-advanced-place-details-compact element is styled inline because it is
conditionally rendered and moved into the info window, which is
part of the map's shadow DOM.
-->
<gmp-advanced-place-details-compact
orientation="horizontal"
truncation-preferred
style="
width: 400px;
padding: 0;
margin: 0;
border: none;
background-color: transparent;
color-scheme: light;
">
<gmp-place-details-place-request></gmp-place-details-place-request>
<gmp-place-media></gmp-place-media>
<gmp-place-rating></gmp-place-rating>
<gmp-place-price></gmp-place-price>
<gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
<gmp-place-open-now-status></gmp-place-open-now-status>
<gmp-place-attribution
light-scheme-color="gray"
dark-scheme-color="white"></gmp-place-attribution>
</gmp-advanced-place-details-compact>
</body>
</html> Элемент select позволяет пользователю выбрать тип заведения из меню. Для простоты в списке представлены только три типа заведений: ресторан, кафе и станция зарядки электромобилей.
<div class="controls">
<label for="type-select">
Select a place type:
<select id="type-select" class="type-select">
<option value="restaurant">Restaurant</option>
<option value="cafe" selected>Cafe</option>
<option value="electric_vehicle_charging_station">
EV charging station
</option>
</select>
</label>
</div> Когда пользователь выбирает тип места из меню, элемент gmp-place-nearby-search-request обновляется, и элемент расширенного поиска мест отображает результаты.
Поиск по текстовому запросу
Введите поисковый запрос в поле ввода и нажмите кнопку «Поиск» , чтобы получить список мест, соответствующих запросу.
Поиск по тексту в основном настроен на поиск с использованием текстового запроса и местоположения, а результаты могут быть уточнены по уровню цены, рейтингу и тому, открыты ли они в данный момент. Результаты также могут быть ранжированы по расстоянию или популярности с помощью свойства rankPreference . Дополнительные сведения см. в справочной документации класса PlaceTextSearchRequestElement .
В этом примере элемент расширенного поиска мест отображается в ответ на текстовый ввод пользователя. Также отображается элемент AdvancedPlaceDetailsCompactElement для выбранного места.
Чтобы добавить элемент расширенного поиска мест на карту, добавьте на HTML-страницу элемент gmp-advanced-place-search с вложенным элементом gmp-place-text-search-request .
<gmp-advanced-place-search selectable>
<gmp-place-text-search-request max-result-count="5"></gmp-place-text-search-request>
<template slot="details-item">
<gmp-place-all-content></gmp-place-all-content>
</template>
</gmp-advanced-place-search> Элемент input позволяет пользователю вводить поисковый запрос.
<div class="controls">
<input
type="text"
id="query-input"
class="query-input"
placeholder="Search for a place"
value="cafe" />
<button id="search-button" class="search-button">
Search
</button>
</div> Когда пользователь нажимает кнопку «Поиск» , запускается функция поиска, обновляется элемент gmp-place-text-search-request , и элемент «Расширенный поиск мест» отображает результаты.
См. полный пример кода.
Машинопись
// Query selectors for various elements in the HTML file. const map = document.querySelector<google.maps.MapElement>('gmp-map')!; const placeSearch = document.querySelector< HTMLElement & { places?: google.maps.places.Place[] } >('gmp-advanced-place-search')!; const placeSearchQuery = document.querySelector< HTMLElement & { textQuery?: string; locationBias?: google.maps.LatLng | google.maps.LatLngLiteral; } >('gmp-place-text-search-request')!; const placeDetails = document.querySelector<HTMLElement>( 'gmp-advanced-place-details-compact' )!; const placeRequest = document.querySelector< HTMLElement & { place?: google.maps.places.Place } >('gmp-place-details-place-request')!; const queryInput = document.querySelector<HTMLInputElement>('.query-input')!; const searchButton = document.querySelector<HTMLElement>('.search-button')!; // Global variables for the map, markers, and info window. const markers = new Map<string, google.maps.marker.AdvancedMarkerElement>(); let infoWindow: google.maps.InfoWindow; // The init function is called when the page loads. async function init(): Promise<void> { // Import the necessary libraries from the Google Maps API. const [{ InfoWindow }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), ]); // Create a new info window and set its content to the place details element. placeDetails.remove(); // Hide the place details element because it is not needed until the info window opens infoWindow = new InfoWindow({ content: placeDetails, ariaLabel: 'Place Details', }); // Set the map options. map.innerMap.setOptions({ clickableIcons: false, mapTypeControl: false, streetViewControl: false, }); // Add event listeners to the query input and place search elements. searchButton.addEventListener('click', () => { searchPlaces(); }); queryInput.addEventListener('keydown', (event: KeyboardEvent) => { if (event.key === 'Enter') { searchPlaces(); } }); placeSearch.addEventListener('gmp-select', (event: Event) => { const place = (event as Event & { place?: google.maps.places.Place }) .place; if (place?.id) { markers.get(place.id)?.click(); } }); placeSearch.addEventListener('gmp-load', () => { void addMarkers(); }); searchPlaces(); } // The searchPlaces function is called when the user changes the query input or when the page loads. function searchPlaces() { // Close the info window and clear the markers. infoWindow.close(); for (const marker of markers.values()) { marker.remove(); } markers.clear(); // Set the place search query and add an event listener to the place search element. if (queryInput.value) { const center = map.center; if (center) { placeSearchQuery.locationBias = center; } // The textQuery property is required for the search element to load. // Any other configured properties will be ignored if textQuery is not set. placeSearchQuery.textQuery = queryInput.value; } } // The addMarkers function is called when the place search element loads. async function addMarkers() { // Import the necessary libraries from the Google Maps API. const [{ AdvancedMarkerElement }, { LatLngBounds }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); if (!placeSearch.places || placeSearch.places.length === 0) { return; } for (const place of placeSearch.places) { if (!place.location) { continue; } const marker = new AdvancedMarkerElement({ map: map.innerMap, position: place.location, collisionBehavior: 'REQUIRED_AND_HIDES_OPTIONAL', }); markers.set(place.id, marker); bounds.extend(place.location); marker.addListener('click', () => { placeRequest.place = place; infoWindow.open(map.innerMap, marker); }); } map.innerMap.fitBounds(bounds); } void init();
JavaScript
// Query selectors for various elements in the HTML file. const map = document.querySelector('gmp-map'); const placeSearch = document.querySelector('gmp-advanced-place-search'); const placeSearchQuery = document.querySelector( 'gmp-place-text-search-request' ); const placeDetails = document.querySelector( 'gmp-advanced-place-details-compact' ); const placeRequest = document.querySelector('gmp-place-details-place-request'); const queryInput = document.querySelector('.query-input'); const searchButton = document.querySelector('.search-button'); // Global variables for the map, markers, and info window. const markers = new Map(); let infoWindow; // The init function is called when the page loads. async function init() { // Import the necessary libraries from the Google Maps API. const [{ InfoWindow }] = await Promise.all([ google.maps.importLibrary('maps'), google.maps.importLibrary('places'), ]); // Create a new info window and set its content to the place details element. placeDetails.remove(); // Hide the place details element because it is not needed until the info window opens infoWindow = new InfoWindow({ content: placeDetails, ariaLabel: 'Place Details', }); // Set the map options. map.innerMap.setOptions({ clickableIcons: false, mapTypeControl: false, streetViewControl: false, }); // Add event listeners to the query input and place search elements. searchButton.addEventListener('click', () => { searchPlaces(); }); queryInput.addEventListener('keydown', (event) => { if (event.key === 'Enter') { searchPlaces(); } }); placeSearch.addEventListener('gmp-select', (event) => { const place = event.place; if (place?.id) { markers.get(place.id)?.click(); } }); placeSearch.addEventListener('gmp-load', () => { void addMarkers(); }); searchPlaces(); } // The searchPlaces function is called when the user changes the query input or when the page loads. function searchPlaces() { // Close the info window and clear the markers. infoWindow.close(); for (const marker of markers.values()) { marker.remove(); } markers.clear(); // Set the place search query and add an event listener to the place search element. if (queryInput.value) { const center = map.center; if (center) { placeSearchQuery.locationBias = center; } // The textQuery property is required for the search element to load. // Any other configured properties will be ignored if textQuery is not set. placeSearchQuery.textQuery = queryInput.value; } } // The addMarkers function is called when the place search element loads. async function addMarkers() { // Import the necessary libraries from the Google Maps API. const [{ AdvancedMarkerElement }, { LatLngBounds }] = await Promise.all([ google.maps.importLibrary('marker'), google.maps.importLibrary('core'), ]); const bounds = new LatLngBounds(); if (!placeSearch.places || placeSearch.places.length === 0) { return; } for (const place of placeSearch.places) { if (!place.location) { continue; } const marker = new AdvancedMarkerElement({ map: map.innerMap, position: place.location, collisionBehavior: 'REQUIRED_AND_HIDES_OPTIONAL', }); markers.set(place.id, marker); bounds.extend(place.location); marker.addListener('click', () => { placeRequest.place = place; infoWindow.open(map.innerMap, marker); }); } map.innerMap.fitBounds(bounds); } void init();
CSS
html, body { height: 100%; margin: 0; } body { display: flex; flex-direction: column; font-family: Arial, Helvetica, sans-serif; } .container { display: flex; height: 100vh; width: 100%; } gmp-map { flex-grow: 1; } .ui-panel { width: 400px; margin-left: 20px; margin-right: 20px; margin-top: 10px; overflow-y: auto; font-family: Arial, Helvetica, sans-serif; } .list-container { display: flex; flex-direction: column; } gmp-place-search { width: 100%; margin: 0; border: none; color-scheme: light; } .query-input { width: 100%; padding: 8px; margin-bottom: 10px; box-sizing: border-box; } .search-button { width: 100%; padding: 8px; margin-bottom: 10px; box-sizing: border-box; background-color: #1a73e8; color: white; border: none; cursor: pointer; } .search-button:hover, .search-button:focus-visible { background-color: #1765cc; }
HTML
<!doctype html>
<html>
<head>
<title>Place Text Search with Google Maps</title>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="module" src="./index.js"></script>
<script>
// prettier-ignore
(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
key: "GOOGLE_MAPS_API_KEY",
v: "beta"
});
</script>
</head>
<body>
<div class="container">
<div class="ui-panel">
<div class="controls">
<input
type="text"
id="query-input"
class="query-input"
placeholder="Search for a place"
value="cafe" />
<button class="search-button">Search</button>
</div>
<div class="list-container">
<gmp-advanced-place-search selectable>
<gmp-place-all-content></gmp-place-all-content>
<gmp-place-text-search-request
max-result-count="5"></gmp-place-text-search-request>
</gmp-advanced-place-search>
</div>
</div>
<!-- map-id is required to use advanced markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
<gmp-map center="-37.813,144.963" zoom="16" map-id="DEMO_MAP_ID">
</gmp-map>
</div>
<!--
The gmp-advanced-place-details-compact element is styled inline because it is
conditionally rendered and moved into the info window, which is
part of the map's shadow DOM.
-->
<gmp-advanced-place-details-compact
orientation="horizontal"
truncation-preferred
style="
width: 400px;
padding: 0;
margin: 0;
border: none;
background-color: transparent;
color-scheme: light;
">
<gmp-place-details-place-request></gmp-place-details-place-request>
<gmp-place-name></gmp-place-name>
<gmp-place-media></gmp-place-media>
<gmp-place-rating></gmp-place-rating>
<gmp-place-price></gmp-place-price>
<gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
<gmp-place-open-now-status></gmp-place-open-now-status>
<gmp-place-attribution
light-scheme-color="gray"
dark-scheme-color="white"></gmp-place-attribution>
</gmp-advanced-place-details-compact>
</body>
</html>Расширенные функции
Настройка кнопок действий
Добавьте кнопки действий в качестве дочерних элементов внутри элемента <template slot="details-item"> компонента расширенного поиска мест. Используйте <gmp-place-link> для стандартных навигационных связей и явно укажите атрибут action . При желании можно указать атрибут slot . Допустимые предопределенные действия: open-website , open-directions , open-map и call . Если атрибут slot опущен, по умолчанию используется action-main .
<gmp-advanced-place-search selectable>
<gmp-place-text-search-request text-query="pizza" max-result-count="5"></gmp-place-text-search-request>
<template slot="details-item">
<gmp-place-name></gmp-place-name>
<gmp-place-link action="open-website" target="_blank"></gmp-place-link>
<gmp-place-link action="open-directions" slot="action-corner"></gmp-place-link>
</template>
</gmp-advanced-place-search>Фильтр отзывов и медиафайлов
В этом примере кода отображаются только медиафайлы и обзоры, в которых упоминается «кофе».
<gmp-advanced-place-search selectable>
<gmp-place-text-search-request text-query="pizza" max-result-count="5"></gmp-place-text-search-request>
<template slot="details-item">
<gmp-place-name></gmp-place-name>
<gmp-place-media query="coffee"></gmp-place-media>
<gmp-place-reviews query="coffee" rank-preference="newest"></gmp-place-reviews>
</template>
</gmp-advanced-place-search>Настройка атрибуции места
Для настройки визуальной атрибуции добавьте элемент <gmp-place-attribution> , чтобы отобразить общие настройки атрибуции данных Maps API, такие как источник фотографии или отзыва. Он должен быть добавлен как непосредственный сосед элемента <template> . Атрибуции, размещенные внутри элемента <template> , будут игнорироваться.
<gmp-advanced-place-search selectable>
<gmp-place-text-search-request text-query="pizza" max-result-count="5"></gmp-place-text-search-request>
<template slot="details-item">
<gmp-place-name></gmp-place-name>
</template>
<gmp-place-attribution light-scheme-color="black" dark-scheme-color="gray"></gmp-place-attribution>
</gmp-advanced-place-search>Обработка ошибок выбора места
Если атрибут selectable присутствует, вы можете отслеживать событие gmp-select , чтобы получить выбранное пользователем место. Вы также можете отслеживать событие gmp-error для корректной обработки ситуаций, когда данные о месте не удается получить.
const searchElement = document.querySelector('gmp-advanced-place-search'); searchElement.addEventListener('gmp-select', (e) => { console.log('User selected place: ', e.place); }); searchElement.addEventListener('gmp-error', (e) => { // e.detail contains the structured error payload console.error('Failed to load places: ', e.detail.error); });