#javascript #google-maps #google-maps-api-3 #infobox
#jquery #google-maps-api-3
Вопрос:
У меня есть приложение, использующее API javscript Google Maps и подключаемый модуль Infobox (настраиваемая версия встроенного InfoWindow).
Он работал нормально, пока у меня не появился следующий вариант использования: мне нужен информационный блок с полосой прокрутки, если контент большой, и он также должен содержать пару HTML-элементов с прослушивателями кликов.
Что мне обычно приходится делать для поддержки обработчиков кликов внутри информационного блока, так это установить enableEventPropagation= true и использовать делегат jQuery для установки обработчика кликов. Делегат jQuery не работает, если я не разрешаю распространение событий.
Это работало нормально, пока мне не пришлось объединить его с функционирующей полосой прокрутки! Я обнаружил, что полоса прокрутки будет работать только в том случае, если у меня есть enableEventPropagation= false, потому что, если включено распространение событий, событие перетаскивания просто передается на карту и интерпретируется как панорамирование.
Кто-нибудь знает, что я могу сделать, чтобы иметь работающую полосу прокрутки для содержимого информационного блока и иметь возможность устанавливать обработчики кликов для некоторых компонентов?
Для меня было бы логично, что enableEventPropagation=false решит обе проблемы, поскольку я не понимаю, почему событие click должно распространяться на карту, чтобы запускать обработчики, которые я прикрепляю к элементам html.
Это объект настройки для моего информационного блока:
{
content: "[my html in here]",
disableAutoPan: false,
pixelOffset: new google.maps.Size(-77, 10),
boxClass: "infoBox",
infoBoxClearance: new google.maps.Size(18, 30),
closeBoxMargin: "14px 6px",
pane: "floatPane",
enableEventPropagation: true
};
Ответ №1:
На всякий случай, если вы все еще работаете над этим, вам нужно изменить параметры карты, чтобы отключить панорамирование / масштабирование при наведении курсора мыши на информационное поле. Вы можете использовать что-то вроде этого:
$(document).delegate("div#ib", "mouseenter", function() {
theMap.setOptions({
draggable: false,
scrollwheel: false
});
console.log("mouse enter detected");
});
$(document).delegate("div#ib", "mouseleave", function() {
theMap.setOptions({
draggable: true,
scrollwheel: true
});
console.log("mouseleave detected");
});
Комментарии:
1. В качестве дополнительной подсказки … убедитесь, что для параметра enableEventPropagation InfoBox установлено значение true, иначе он проглотит события, такие как Moby Dick 🙂
2. Селектор идентификаторов $(«#ib») работает быстрее, чем $(«div#ib»), потому что это собственный селектор, преобразованный в document.getelementbyid(«ib»).
3. Я думал, что схожу с ума! Я включал делегирование событий
document
, и оно все еще не срабатывало. Я подумал, что, возможно, Google Maps создает iframes или какие-то другие странные вещи. Спасибо!