Задать вопрос
@silencer-spirit

Существует настройка пользовательского балуна в yandex map без jquery?

Начал настраивать пользовательский балун в Яндекс картах и столкнулся с проблемой: у них в примере https://tech.yandex.ru/maps/jsbox/2.1/balloon_autopan используется jquery.

Существует ли где-то пример с этим куском кода, но на чистом js?

build: function() {
  this.constructor.superclass.build.call(this);

  this._$element = $('.balloon', this.getParentElement());

  this.applyElementOffset();

  this._$element.find('.map-tooltip__close')
    .on('click', $.proxy(this.onCloseClick, this));
},
clear: function() {
  this._$element.find('.map-tooltip__close')
    .off('click');

  this.constructor.superclass.clear.call(this);
},
onSublayoutSizeChange: function() {
  MyBalloonLayout.superclass.onSublayoutSizeChange.apply(this, arguments);

  if (!this._isElement(this._$element)) {
    return;
  }

  this.applyElementOffset();

  this.events.fire('shapechange');
},
applyElementOffset: function() {
  this._$element.css({
    left: -(this._$element[0].offsetWidth / 2),
    top: -(this._$element[0].offsetHeight + this._$element.find('.map-tooltip')[0].offsetHeight)
  });
},
onCloseClick: function(e) {
  e.preventDefault();

  this.events.fire('userclose');
},
  getShape: function() {
    if (!this._isElement(this._$element)) {
      return MyBalloonLayout.superclass.getShape.call(this);
    }

    var position = this._$element.position();

    return new ymaps.shape.Rectangle(new ymaps.geometry.pixel.Rectangle([
      [position.left, position.top],
      [
        position.left + this._$element[0].offsetWidth,
        position.top + this._$element[0].offsetHeight + this._$element.find('.map-tooltip')[0].offsetHeight
      ]
    ]));
  },
_isElement: function(element) {
  return element && element[0] && element.find('.map-tooltip')[0];
}
  • Вопрос задан
  • 599 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Яндекс.Карты
Существует ли где-то пример с этим куском кода, но на чистом js?

теперь существует

<script src="https://api-maps.yandex.ru/2.1.73/?lang=ru_RU"></script>
<link rel="stylesheet" href="https://yandex.st/bootstrap/2.3.2/css/bootstrap.min.css">

<div id="map"></div>
<button id="set-balloon-header" class="btn">Задать заголовок балуна</button>
<button id="set-balloon-content" class="btn">Задать содержимое балуна</button>

html, body {
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
}

#map {
  height: 85%;
}

.popover {
  display: block;
}

.popover .close {
  position: absolute;
  right: 5px;
  top: 1px;
}

.btn {
  margin-top: 10px;
}

ymaps.ready(function () {
  // Создание экземпляра карты и его привязка к созданному контейнеру.
  var myMap = new ymaps.Map('map', {
    center: [55.751574, 37.573856],
    zoom: 9,
    behaviors: ['default', 'scrollZoom']
  }, {
    searchControlProvider: 'yandex#search'
  }),

  // Создание макета балуна на основе Twitter Bootstrap.
  MyBalloonLayout = ymaps.templateLayoutFactory.createClass(
    '<div class="popover top">' +
      '<a class="close" href="#">&times;</a>' +
      '<div class="arrow"></div>' +
      '<div class="popover-inner">' +
        '$[[options.contentLayout observeSize minWidth=235 maxWidth=235 maxHeight=350]]' +
      '</div>' +
    '</div>', {
    /**
      * Строит экземпляр макета на основе шаблона и добавляет его в родительский HTML-элемент.
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build
      * @function
      * @name build
      */
    build: function () {
      this.constructor.superclass.build.call(this);

      this._element = this.getParentElement().querySelector('.popover');
      this._onCloseClick = this.onCloseClick.bind(this);

      this.applyElementOffset();

      this._element.querySelector('.close').addEventListener('click', this._onCloseClick);
    },

    /**
      * Удаляет содержимое макета из DOM.
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#clear
      * @function
      * @name clear
      */
    clear: function () {
      this._element.querySelector('.close').removeEventListener('click', this._onClickClick);

      this.constructor.superclass.clear.call(this);
    },

    /**
      * Метод будет вызван системой шаблонов АПИ при изменении размеров вложенного макета.
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
      * @function
      * @name onSublayoutSizeChange
      */
    onSublayoutSizeChange: function () {
      MyBalloonLayout.superclass.onSublayoutSizeChange.apply(this, arguments);

      if (!this._isElement(this._element)) {
        return;
      }

      this.applyElementOffset();

      this.events.fire('shapechange');
    },

    /**
      * Сдвигаем балун, чтобы "хвостик" указывал на точку привязки.
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
      * @function
      * @name applyElementOffset
      */
    applyElementOffset: function () {
      Object.assign(this._element.style, {
        left: -(this._element.offsetWidth / 2) + 'px',
        top: -(this._element.offsetHeight + this._element.querySelector('.arrow').offsetHeight) + 'px'
      });
    },

    /**
      * Закрывает балун при клике на крестик, кидая событие "userclose" на макете.
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose
      * @function
      * @name onCloseClick
      */
    onCloseClick: function (e) {
      e.preventDefault();

      this.events.fire('userclose');
    },

    /**
      * Используется для автопозиционирования (balloonAutoPan).
      * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILayout.xml#getClientBounds
      * @function
      * @name getClientBounds
      * @returns {Number[][]} Координаты левого верхнего и правого нижнего углов шаблона относительно точки привязки.
      */
    getShape: function () {
      if (!this._isElement(this._element)) {
        return MyBalloonLayout.superclass.getShape.call(this);
      }

      var style = getComputedStyle(this._element);
      var position = {
        left: parseFloat(style.left),
        top: parseFloat(style.top),
      };

      return new ymaps.shape.Rectangle(new ymaps.geometry.pixel.Rectangle([
        [position.left, position.top], [
          position.left + this._element.offsetWidth,
          position.top + this._element.offsetHeight + this._element.querySelector('.arrow').offsetHeight
        ]
      ]));
    },

    /**
      * Проверяем наличие элемента (в ИЕ и Опере его еще может не быть).
      * @function
      * @private
      * @name _isElement
      * @param {jQuery} [element] Элемент.
      * @returns {Boolean} Флаг наличия.
      */
    _isElement: function (element) {
      return element && element.querySelector('.arrow');
    }
  }),

  // Создание вложенного макета содержимого балуна.
  MyBalloonContentLayout = ymaps.templateLayoutFactory.createClass(
    '<h3 class="popover-title">$[properties.balloonHeader]</h3>' +
    '<div class="popover-content">$[properties.balloonContent]</div>'
  ),

  // Создание метки с пользовательским макетом балуна.
  myPlacemark = window.myPlacemark = new ymaps.Placemark(myMap.getCenter(), {
    balloonHeader: 'Заголовок балуна',
    balloonContent: 'Контент балуна'
  }, {
    balloonShadow: false,
    balloonLayout: MyBalloonLayout,
    balloonContentLayout: MyBalloonContentLayout,
    balloonPanelMaxMapArea: 0
    // Не скрываем иконку при открытом балуне.
    // hideIconOnBalloonOpen: false,
    // И дополнительно смещаем балун, для открытия над иконкой.
    // balloonOffset: [3, -40]
  });

  myMap.geoObjects.add(myPlacemark);
});


document.querySelector('#set-balloon-header').addEventListener('click', function() {
  window.myPlacemark.properties.set(
   'balloonHeader',
   'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
    + 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'
  );
});

document.querySelector('#set-balloon-content').addEventListener('click', function() {
  window.myPlacemark.properties.set(
    'balloonContent',
    'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
    + 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'
  );
});

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
uselessmindYEAH
@uselessmindYEAH
Frontback cocaine developer
Возможно что и не существует, придется самому переписать чутка
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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