Клуб API Карт

Как закрыть балун

Пост в архиве.
softshape2
3 марта 2010, 12:01

Всем привет,


в балуне я использую HTML текст, среди прочего в нем есть ссылка, при клике на которой балун должен закрыться. Как это сделать из JavaScript'а ?

7 комментариев
Примерно так:

Link

Либо делать свой макет.
Николай Конев
4 марта 2010, 17:51
а события стандартным API нельзя присобачивать? Пихать евенты в разметку - некошерно.
В Гугле есть объект event. Да и jQuery можно пользовать. Тем более, что в Яндекс-картах он нативный.
Можно, но средствами АПИ получить доступ к разметке балуна (не создав собственный макет) нельзя. Вы можете либо сделать простенький макет, что-то вроде:

var myLayout = function () {
  var $element = YMaps.jQuery('

Текст в балуне ссылка

');
  this.onAddToParent = function (parent) {
     $element.appendTo(parent).bind('click', function (e) {
        map.closeBalloon();
        return false; // Чтобы браузер не пытался перейти по ссылке
     }
  };

  this.onRemoveFromParent = function () {
    $element.remove();
  };
};

var myTemplate = new YMaps.LayoutTemplate(myLayout);

и далее указать в стиле этот шаблон (например, если балун открывается у метки):
var placemark = new YMaps.Placemark(point, { style: { balloonContentStyle: { template: myTemplate } } });

Либо Вы можете указать уникальный id для Вашего тэга a и после открытия балуна самостоятельно найти его в DOM и повесить обработчик событий.
Николай Конев
5 марта 2010, 06:28
Ну раз дошло до конкретных примеров...
Аппендим в плэйсмарк такой код

TextOfBalloon X


А до или после создания баллунов пишем такое:
// $ - для краткости
$(".balloon-close").live("click", function(){
    $(this).parents("p:first").hide();
});

И создаем баллуны сколько душе угодно.
Сделал. Заработало. Но возник побочный эффект. Рядом у меня стоит код, обрабатывающий нажатия на карту -

listener = YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {
......
}, this);

Так вот он "дергается" и в момент клика на балуне, и на ссылке внутри этого балуна. Можно как-то его локализовать на карту только ?
Попробуйте пример со своим макетом (http://clubs.ya.ru/mapsapi/replies.xml?parent_id=8554&item_no=8533&with_parent=1#reply-mapsapi-8554), там этой проблемы нет.
вариант два - посмотрите чей ивент срабатывает раньше.
если ваш - тогда можно заглушить его спуск дальше в карту ( preventDefault )