Z-порядок маркеров для кластеризации [дубликат]

После переориентации текстового поля с помощью txtarea.focus() добавьте эту строку:

txtarea.selectionEnd= end + 7;

Это установит курсор на семь позиций раньше, чем раньше, что будет учитывать [b][/b].

Пример

document.getElementById('bold').addEventListener('click', boldText);

function boldText() {
  var txtarea = document.getElementById("editor_area");
  var start = txtarea.selectionStart;
  var end = txtarea.selectionEnd;
  var sel = txtarea.value.substring(start, end);
  var finText = txtarea.value.substring(0, start) + '[b]' + sel + '[/b]' + txtarea.value.substring(end);
  txtarea.value = finText;
  txtarea.focus();
  txtarea.selectionEnd= end + 7;
}
#editor_area {
  width: 100%;
  height: 10em;
}
<button id="bold">B</button>
<textarea id="editor_area"></textarea>

13
задан cv87 20 April 2012 в 10:48
поделиться

3 ответа

Насколько я знаю, это невозможно. Кластеры находятся в более высокой области, чем изображение маркера.

https://developers.google.com/maps/documentation/javascript/reference#MapPanes

3
ответ дан Rick 19 August 2018 в 18:42
поделиться

У меня была такая же проблема, но я не хотел обрабатывать новый оверлей.

Не создавая конкретного наложения, вы можете просто переключить z-индексы родительских контейнеров наложения.

Это может быть достигнуто с помощью следующей функции:

_changeOverlayOrder = function(map) {
    var panes = map.getPanes();
    var markerOverlayDiv = panes.overlayImage.parentNode;
    var clusterOverlayDiv = panes.overlayMouseTarget.parentNode;
    // Make the clusters clickable.
    if(!markerOverlayDiv.style.pointerEvents) {
        markerOverlayDiv.style.cssText += ";pointer-events: none;";
    }
    // Switch z-indexes
    if(markerOverlayDiv.style.zIndex < clusterOverlayDiv.style.zIndex) {
        var tmp = markerOverlayDiv.style.zIndex;
        markerOverlayDiv.style.zIndex = clusterOverlayDiv.style.zIndex;
        clusterOverlayDiv.style.zIndex = tmp;
    }
};

Надеюсь, что это поможет.

4
ответ дан mouwah 19 August 2018 в 18:42
поделиться
  • 1
    Что такое & quot; это & ​​quot; в this.getPanes ()? – marcovtwout 11 June 2013 в 13:37
  • 2
    Ответ @ mouwah почти правильный, но нет метода getPanes() для объекта карты. Вы должны определить свой собственный класс OverlayView(), чтобы использовать метод getPanes() и изменить zIndex на панели overlayMouseTarget. – Maximus S 14 April 2014 в 03:08
  • 3
    Этот код был отлично работает до сих пор, но теперь Google изменил что-то, и он внезапно прекратил работать! – TMS 8 July 2014 в 09:56
  • 4
    Я поставил щедрость на этот вопрос, поэтому, если вы адаптируете свой ответ к новой ситуации, вы можете это достичь – TMS 10 July 2014 в 22:12

Это можно сделать, но это довольно ухабистый путь, пока вы не доберетесь туда ... Как говорит Рик, проблема в том, что MarkerClusterer добавляет собственный OverlayView со значками своего кластера на более высоком уровне в качестве обычных маркеров. Единственный способ добавить маркер над кластерами - обыграть кластер с собственным оружием и добавить собственный OverlayView и добавить разметку значка маркера на еще более высокую панель (читайте о панелях здесь ). Мне это действительно не нравится, но это единственный способ, которым я нашел.

Для этого вам нужно создать пользовательский оверлей, реализующий google.maps.OverlayView (ссылка ), хороший пример можно найти здесь здесь (с пояснениями я использовал немного кода из него).

Вот грубый прототип CustomOverlay:

// build custom overlay class which implements google.maps.OverlayView
function CustomOverlay(map, latlon, icon, title) {
    this.latlon_ = latlon;
    this.icon_ = icon;
    this.title_ = title;
    this.markerLayer = jQuery('<div />').addClass('overlay');
    this.setMap(map);
};
CustomOverlay.prototype = new google.maps.OverlayView;
CustomOverlay.prototype.onAdd = function() {
    var $pane = jQuery(this.getPanes().floatPane); // Pane 6, one higher than the marker clusterer
    $pane.append(this.markerLayer);
};
CustomOverlay.prototype.onRemove = function(){
    this.markerLayer.remove();
};
CustomOverlay.prototype.draw = function() {
    var projection = this.getProjection();
    var fragment = document.createDocumentFragment();

    this.markerLayer.empty(); // Empty any previous rendered markers

    var location = projection.fromLatLngToDivPixel(this.latlon_);
    var $point = jQuery('<div class="map-point" title="'+this.title_+'" style="'
                            +'width:32px; height:32px; '
                            +'left:'+location.x+'px; top:'+location.y+'px; '
                            +'position:absolute; cursor:pointer; '
                        +'">'
                        +'<img src="'+this.icon_+'" style="position: absolute; top: -16px; left: -16px" />'
                    +'</div>');

    fragment.appendChild($point.get(0));
    this.markerLayer.append(fragment);
};

Этот оверлей получает карту, объект LatLng и URL-адрес значка. Хорошо, что вы можете написать свой собственный HTML-код для слоя, плохо то, что вы должны обрабатывать все, что API Карт делает для вас (например, обработчик привязки изображения маркера) самостоятельно. Пример работает только с изображениями 32x32px, где якорь находится посередине изображения, поэтому он все еще довольно грубый.

Чтобы использовать CustomOverlay, просто создайте его следующим образом:

// your map center / marker LatLng
var myLatlng = new google.maps.LatLng(24.247471, 89.920990);

// instantiate map
var map = new google.maps.Map(
    document.getElementById("map-canvas"),
    {zoom: 4, center: myLatlng, mapTypeId: google.maps.MapTypeId.ROADMAP}
);  

// create the clusterer, but of course with markers
//var markerClusterer = new MarkerClusterer(map, []);

// add custom overlay to map
var customCustomOverlay = new CustomOverlay(map, myLatlng, 'http://www.foo.bar/icon.png');

Надеюсь, это сработает для вас.

3
ответ дан rkallensee 19 August 2018 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: