2016-09-14 2 views
1

Я использую JavaScript API JavaScript для Карт Google, и я хотел бы добавить фразу «Начиная с» в класс «.adp-placemark», который включен в выходные данные Google:Элемент направления Prepend to Gmaps

$('.adp-placemark').prepend('Starting From:'); 

Префикс не работает. Однако, если я просматриваю страницу и использую инструмент «Консоль» в «Инспекторе», а затем запускаю вышеуказанный код, он будет добавляться так, как должен.

Где разместить этот код? Я также попытался разместить его в отдельной функции и внутри документа.

function initMap() { 
 
    var directionsDisplay = new google.maps.DirectionsRenderer; 
 
    var directionsService = new google.maps.DirectionsService; 
 
    var map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 7, 
 
    center: {lat: 41.85, lng: -87.65} 
 
    }); 
 
    directionsDisplay.setMap(map); 
 
    directionsDisplay.setPanel(document.getElementById('right-panel')); 
 

 
    var control = document.getElementById('floating-panel'); 
 
    control.style.display = 'block'; 
 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(control); 
 

 
    var onChangeHandler = function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay); 
 
    }; 
 
    document.getElementById('start').addEventListener('change', onChangeHandler); 
 
    document.getElementById('end').addEventListener('change', onChangeHandler); 
 
} 
 

 
function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
    var start = document.getElementById('start').value; 
 
    var end = document.getElementById('end').value; 
 
    directionsService.route({ 
 
    origin: start, 
 
    destination: end, 
 
    travelMode: 'DRIVING' 
 
    }, function(response, status) { 
 
    if (status === 'OK') { 
 
     directionsDisplay.setDirections(response); 
 
     $('.adp-placemark').prepend('Starting From:'); 
 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
}
html, body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 
#map { 
 
    height: 100%; 
 
} 
 
#floating-panel { 
 
    position: absolute; 
 
    top: 10px; 
 
    left: 25%; 
 
    z-index: 5; 
 
    background-color: #fff; 
 
    padding: 5px; 
 
    border: 1px solid #999; 
 
    text-align: center; 
 
    font-family: 'Roboto','sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 
#right-panel { 
 
    font-family: 'Roboto','sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 

 
#right-panel select, #right-panel input { 
 
    font-size: 15px; 
 
} 
 

 
#right-panel select { 
 
    width: 100%; 
 
} 
 

 
#right-panel i { 
 
    font-size: 12px; 
 
} 
 
#right-panel { 
 
    height: 100%; 
 
    float: right; 
 
    width: 390px; 
 
    overflow: auto; 
 
} 
 
#map { 
 
    margin-right: 400px; 
 
} 
 
#floating-panel { 
 
    background: #fff; 
 
    padding: 5px; 
 
    font-size: 14px; 
 
    font-family: Arial; 
 
    border: 1px solid #ccc; 
 
    box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4); 
 
    display: none; 
 
} 
 
@media print { 
 
    #map { 
 
    height: 500px; 
 
    margin: 0; 
 
    } 
 
    #right-panel { 
 
    float: none; 
 
    width: auto; 
 
    } 
 
}
<div id="floating-panel"> 
 
    <strong>Start:</strong> 
 
    <select id="start"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
    <br> 
 
    <strong>End:</strong> 
 
    <select id="end"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
</div> 
 
<div id="right-panel"></div> 
 
<div id="map"></div> 
 
<!-- Replace the value of the key parameter with your own API key. --> 
 
<script async defer 
 
src="https://maps.googleapis.com/maps/api/js?sensor=false&callback=initMap"> 
 
</script>

+0

'.adp-placemark' - этот класс генерируется API-интерфейсом google? Можете ли вы создать скрипку для этого? –

ответ

1

EDIT: Как уже упоминалось в комментариях первое решение было неполным, как «Начиная от:» был добавлен в обеих таблицах (которые я пропустил в первый раз)

Для того, чтобы решить эту проблему, используя только CSS, вы можете добавить nth-child(n) селекторов, чтобы найти .adp-placemark, чтобы включить добавленный текст, например:

/* Pseudo-element to add 'Starting from:' to the first element that appears */ 
    .adp > div:nth-child(2) .adp-placemark::before { 
     content: 'Starting from:'; 
     white-space: nowrap; 
    } 

    /* Pseudo-element to add 'Going to:' to the second element that appears */ 
    .adp > div:nth-child(3) .adp-placemark::before { 
     content: 'Going to:'; 
     white-space: nowrap; 
    } 

С другой стороны, так какright-panel код сгенерирована Api Google Maps не будет пытаться изменить программно сгенерированный HTML, потому что в конечном итоге API может предоставить другую структуру, что сделало бы решение fail (было решением в js или css).


Один из способов идти о решении этой вопроса будет включать CSS псевдо-класс к .adp-placemark, устраняя необходимость получить время таблицы рендеринга права, например, так:

.adp-placemark::before { 
    content: 'Starting from:'; 
    white-space: nowrap; 
} 

Я также обновил свой фрагмент кода:

function initMap() { 
 
    var directionsDisplay = new google.maps.DirectionsRenderer; 
 
    var directionsService = new google.maps.DirectionsService; 
 
    var map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 7, 
 
    center: {lat: 41.85, lng: -87.65} 
 
    }); 
 
    directionsDisplay.setMap(map); 
 
    directionsDisplay.setPanel(document.getElementById('right-panel')); 
 

 
    var control = document.getElementById('floating-panel'); 
 
    control.style.display = 'block'; 
 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(control); 
 

 
    var onChangeHandler = function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay); 
 
    }; 
 
    document.getElementById('start').addEventListener('change', onChangeHandler); 
 
    document.getElementById('end').addEventListener('change', onChangeHandler); 
 
} 
 

 
function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
    var start = document.getElementById('start').value; 
 
    var end = document.getElementById('end').value; 
 
    directionsService.route({ 
 
    origin: start, 
 
    destination: end, 
 
    travelMode: 'DRIVING' 
 
    }, function(response, status) { 
 
    if (status === 'OK') { 
 
     directionsDisplay.setDirections(response); 
 
     $('.adp-placemark').prepend('Starting From:'); 
 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
}
html, body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 
#map { 
 
    height: 100%; 
 
} 
 
#floating-panel { 
 
    position: absolute; 
 
    top: 10px; 
 
    left: 25%; 
 
    z-index: 5; 
 
    background-color: #fff; 
 
    padding: 5px; 
 
    border: 1px solid #999; 
 
    text-align: center; 
 
    font-family: 'Roboto','sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 
#right-panel { 
 
    font-family: 'Roboto','sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 

 
#right-panel select, #right-panel input { 
 
    font-size: 15px; 
 
} 
 

 
#right-panel select { 
 
    width: 100%; 
 
} 
 

 
#right-panel i { 
 
    font-size: 12px; 
 
} 
 
#right-panel { 
 
    height: 100%; 
 
    float: right; 
 
    width: 390px; 
 
    overflow: auto; 
 
} 
 
#map { 
 
    margin-right: 400px; 
 
} 
 
#floating-panel { 
 
    background: #fff; 
 
    padding: 5px; 
 
    font-size: 14px; 
 
    font-family: Arial; 
 
    border: 1px solid #ccc; 
 
    box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4); 
 
    display: none; 
 
} 
 

 
/* Pseudo-element to add 'Starting from:' to the first element that appears */ 
 
.adp > div:nth-child(2) .adp-placemark::before { 
 
    content: 'Starting from:'; 
 
    white-space: nowrap; 
 
} 
 

 
/* Pseudo-element to add 'Going to:' to the second element that appears */ 
 
.adp > div:nth-child(3) .adp-placemark::before { 
 
    content: 'Going to:'; 
 
    white-space: nowrap; 
 
} 
 

 

 
@media print { 
 
    #map { 
 
    height: 500px; 
 
    margin: 0; 
 
    } 
 
    #right-panel { 
 
    float: none; 
 
    width: auto; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="floating-panel"> 
 
    <strong>Start:</strong> 
 
    <select id="start"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
    <br> 
 
    <strong>End:</strong> 
 
    <select id="end"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
</div> 
 
<div id="right-panel"></div> 
 
<div id="map"></div> 
 
<!-- Replace the value of the key parameter with your own API key. --> 
 
<script async defer 
 
src="https://maps.googleapis.com/maps/api/js?sensor=false&callback=initMap"> 
 
</script>

Надеюсь, что это поможет, Приветствия.

+0

Это было бы хорошим решением, но для расширения моего вопроса ... Существует начальный адрес и конечный адрес, показанный, что оба используют класс «.adp-placemark». Первый сказал бы «Начиная с», а второй - «Окончание в». Вы знаете, как я могу настроить таргетинг на первый и второй отдельно? Спасибо за вашу помощь – cpcdev

+0

Я вижу, на самом деле на моем телефоне сейчас, можете ли вы проверить, будет ли это работать? # правая таблица.adp-отметка: first-child: before { содержание: 'Начиная от:'; white-space: nowrap; } # правая таблица.adp-отметка: последний ребенок: до { содержание: 'Going to:'; white-space: nowrap; } –

+0

Я попробовал ваше предложение выше, и он добавляет все классы .adp-placemark с «Go to to». Также кажется, что класс .adp-placemark может быть нацелен на nth-of-type (1), но он не находит ни одного с nth-of-type (2) – cpcdev

0

Вам нужно ждать боковой панели, чтобы быть оказаны (API Карт Google Javascript управляется событиями и асинхронный). Добавление setTimeout вокруг операции перед именем работ (подтверждает концепцию, хотя это запутано):

setTimeout(function() { 
    $('.adp-placemark').prepend('Starting From:'); 
}, 500); 

(Кроме того, необходимо добавить JQuery в свой код, чтобы он работал ...) Это заставляет браузер задерживайте операцию добавления до завершения обработки боковой панели.

function initMap() { 
 
    var directionsDisplay = new google.maps.DirectionsRenderer; 
 
    var directionsService = new google.maps.DirectionsService; 
 
    var map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 7, 
 
    center: { 
 
     lat: 41.85, 
 
     lng: -87.65 
 
    } 
 
    }); 
 
    directionsDisplay.setMap(map); 
 
    directionsDisplay.setPanel(document.getElementById('right-panel')); 
 

 
    var control = document.getElementById('floating-panel'); 
 
    control.style.display = 'block'; 
 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(control); 
 

 
    var onChangeHandler = function() { 
 
    calculateAndDisplayRoute(directionsService, directionsDisplay); 
 
    }; 
 
    document.getElementById('start').addEventListener('change', onChangeHandler); 
 
    document.getElementById('end').addEventListener('change', onChangeHandler); 
 
} 
 

 
function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
    var start = document.getElementById('start').value; 
 
    var end = document.getElementById('end').value; 
 
    directionsService.route({ 
 
    origin: start, 
 
    destination: end, 
 
    travelMode: 'DRIVING' 
 
    }, function(response, status) { 
 
    if (status === 'OK') { 
 
     directionsDisplay.setDirections(response); 
 
     setTimeout(function() { 
 
     $('.adp-placemark').prepend('Starting From:'); 
 
     }, 500); 
 

 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
}
html, 
 
body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 
#map { 
 
    height: 100%; 
 
} 
 
#floating-panel { 
 
    position: absolute; 
 
    top: 10px; 
 
    left: 25%; 
 
    z-index: 5; 
 
    background-color: #fff; 
 
    padding: 5px; 
 
    border: 1px solid #999; 
 
    text-align: center; 
 
    font-family: 'Roboto', 'sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 
#right-panel { 
 
    font-family: 'Roboto', 'sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
} 
 
#right-panel select, 
 
#right-panel input { 
 
    font-size: 15px; 
 
} 
 
#right-panel select { 
 
    width: 100%; 
 
} 
 
#right-panel i { 
 
    font-size: 12px; 
 
} 
 
#right-panel { 
 
    height: 100%; 
 
    float: right; 
 
    width: 390px; 
 
    overflow: auto; 
 
} 
 
#map { 
 
    margin-right: 400px; 
 
} 
 
#floating-panel { 
 
    background: #fff; 
 
    padding: 5px; 
 
    font-size: 14px; 
 
    font-family: Arial; 
 
    border: 1px solid #ccc; 
 
    box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4); 
 
    display: none; 
 
} 
 
@media print { 
 
    #map { 
 
    height: 500px; 
 
    margin: 0; 
 
    } 
 
    #right-panel { 
 
    float: none; 
 
    width: auto; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="floating-panel"> 
 
    <strong>Start:</strong> 
 
    <select id="start"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
    <br> 
 
    <strong>End:</strong> 
 
    <select id="end"> 
 
    <option value="chicago, il">Chicago</option> 
 
    <option value="st louis, mo">St Louis</option> 
 
    <option value="joplin, mo">Joplin, MO</option> 
 
    <option value="oklahoma city, ok">Oklahoma City</option> 
 
    <option value="amarillo, tx">Amarillo</option> 
 
    <option value="gallup, nm">Gallup, NM</option> 
 
    <option value="flagstaff, az">Flagstaff, AZ</option> 
 
    <option value="winona, az">Winona</option> 
 
    <option value="kingman, az">Kingman</option> 
 
    <option value="barstow, ca">Barstow</option> 
 
    <option value="san bernardino, ca">San Bernardino</option> 
 
    <option value="los angeles, ca">Los Angeles</option> 
 
    </select> 
 
</div> 
 
<div id="right-panel"></div> 
 
<div id="map"></div> 
 
<!-- Replace the value of the key parameter with your own API key. --> 
 
<script async defer src="https://maps.googleapis.com/maps/api/js?sensor=false&callback=initMap"> 
 
</script>

+0

Спасибо @geocodezip это решение работает тоже – cpcdev

Смежные вопросы