Клуб API Карт

Не работает live("click", fun....) у балуна.

EFRRR
3 апреля 2010, 00:53

Доброй всем ночи. Проблема с ледующем, представлю небольшой пример:(кусок кода)

<script
type="text/javascript">
     
  
var map;

     
  
// Создание обработчика для события
window.onLoad

        YMaps.jQuery(function () {
            //
Создание экземпляра карты и его привязка к созданному контейнеру

            map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);

       
    
// Установка для карты ее центра и
масштаба

            map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10);
            YMaps.Events.observe(map, map.Events.Click,  function (map, mEvent) {

       
    
//Создаём метку.
            pmark = new YMaps.Placemark(mEvent.getGeoPoint());


   
        
pmark.description = '<div><form
name="addform" class="addform">

                                        <textarea rows="10" cols="45" name="text"
class="text">

                 
                      
</textarea><p><input
type="submit" value="Сохранить!"   class="saveform" /></p>

                                        </form></div>';

         
 

            map.addOverlay(pmark);

       
  

            pmark.openBalloon();
            });

        });
    </script>
    <script type="text/javascript">

 
  
$(document).ready(function(){

     
  
$("a.savenoteform").live("click", function() {
        alert(1);
        return false;
    });


    $(".test").click(function() {
         
  
var form = $('<form class="testform"></form>');
            var testcontent = $('<input type="submit" class="typesubmittest" />');
            form.append(testcontent);
            $(".testdiv").html(form);
         
  
return false;
        });


    $(".typesubmittest").live("click", function(){
        alert(9);
        return false;
    });
    });
    </script>
</head>

<body>
    <div id="YMapsID" style="width:600px;height:400px"></div>
    <div class="testdiv"><a href="" class="test">Test</a></div>

</body>

Вот. Суть в след. создаём карту, лепим на страницу, создаём обработчик клика по карте, в результате которого должна появится метка, и у неё открыться балун, в котором написана форма. У формы есть кнопочка сохранить(инпут с типом сабмит) со своим классом, на который висит обработчик live("click", func...). В результате при клике на этой кнопочке должен срабатывать алерт(1). Этого как мы видим не происходит. Для эксперимента была добавлена ссылочка Test с опр. классом, при клике на которой динамически средствами jQuery формируется также кнопочка с опр. классом, и на нём висит обработчик live("click", func...) аналогичный предыдущему, но всё срабатывает(флерт всмысле). Т.е. причина в самих картах??? Почему live не может найти форму???



10 комментариев
Подписаться на комментарии к посту
А причем тут карта? Вы пытаетесь повесить обработчик на элемент которого в данный момент не существует. Содержимое балуна генерится динамически после клика на метку. В тот момент когда вы хотите повесить туда обработчик такого элемента как ссылка в теле балуна не существует. И браузер даже не подозревает о ее наличии... Как лечить: 1. В текст ссылки добавить onclick="вызов функции" 2. Ставить обработчик после того как был показан балун
Немного не тот код скинул, обработчик вешается на кнопку там $("input.savenoteform").live("click", function() {
        alert(1);
        return false;
    });
Это во-первых. Во-вторых, вот именно потом что форма динамическая, должен срабатывать live. Он не срабатывает.
"2. Ставить обработчик после того как был показан балун" - live  существует для того, чтобы этого не делать.
А карта при том, что именно на динамической кнопке в балуне не срабатывает live. за картой работает. Я по-моему описал выше.
Еще раз объясняю... У вас сейчас следующая логика: 1. повесили обработчик на кнопку 2. создали кнопку 3. обработчик на кнопке не работает.. тот элемента что как вы говорите "за картой" на момент установки обработчика существует и поэтому обработчик на него устанвливается. содержимое же балуна, с точки зрения JavaScript и браузера на момент установки обработчика, не существует. И значит туда обработчик не ставится. Учите матчасть...
Обьясняю ещё раз. Кнопка которая за картой не существует. Она появляется также динамически при клике по ссылке.
Я выложил на jsbin:
http://jsbin.com/upofu/5
Плюс Вы не понимаете что такое обработчик live как я вижу. Для него не должно в момент инициализации существовать кнопки. Он и предназначен для динамических элементов!!!!! Или Вы не понимаете, что такое динамические элементы...
Карта не пропускает через себя события, поэтому live-обработчики не срабатывают.

Могу посоветовать не использовать live, а навешивать обработчики с помощью bind.
Просто аналогичный код в GMaps вполне себе работает. А можно узнать причины такого поведения? Что смотреть по этому вопросу?
У нас такая концепция работа с событиями.
Карта представляет собой отдельный, независимый блок на странице. В связи с этим она не пропускает события через себя.

Мы подумаем. Возможно, что в следующих версиях система событий изменится.