Клуб API Карт

Событие загрузки????

bash81
15 декабря 2009, 09:43

Подозреваю что тема избитая, но к сожалению в клубе ответа не нашел.

function showballoon(num) { 
        YMaps.Events.observe(ml, ml.Events.Load, function (ml, error) {
          var obj = this.filter(function (obj) {
              return obj.id == num
          });
          obj[0].openBalloon();
        }); 

  };

 

если эту функцию выхвать до того как карта загрузилась, то она перестает грузится и сооитветственно

ml = new YMaps.YMapsML('from_site');
map.addOverlay(ml);

тоже не отрабатывает.  Что я не так сделал?

 

8 комментариев
Подписаться на комментарии к посту
значит надо ждать загрузки карты.
скажу даже более - в google v3 после того как вы загрузили карту с ней нельзя работать - приходиться ждать события ее готовности
Не совсем понятно как взаимодействуют два представленных куска кода. Да и такое ощущение что части кода тоже не хватате. Возможно проблемы где-то там. И потом совсем не понятно назначение функции showballoon. Верней понятно, что вы хотите показывать балун по конкретному номеру. Но вот реализация нелогична. У вас получается что при каждом вызове функции ставится обработчик события. Но обработчик события отработает один раз... К тому же событие у вас Load, а обработчик стоит как для Fault :) Для достижения вашей задачи я бы сделал следующие. 1. Завел глобальную переменную var IsLoaded=0; 2. Поставил бы обработчик на загрузку YMaps.Events.observe(ml, ml.Events.Load, function (ml) { isLoaded=1; }); 3. Переписал функцию показа балуна function showballoon(num) { if(isLoaded==0) { return; } var obj = this.filter(function (obj) { return obj.id == num }); obj[0].openBalloon(); } 4. Проверил весь код на правильность последовательности операций и использования переменных (глобальные и локальные)
Спасибо за ответ, я несовсем верно задал вопрос надергал куски кода, все так и есть как у вас написано, единственно мне нехватало в эту же функцию вставить обработчик на клик меню, как раз как советует Александр.
Скорее всего перед вами стоит задача связать некоторое меню с объектами на карте.

Можно поступить как подсказал NeWMaN, а можно навесить обработчики событий после загрузки YMapsML.

Предположим у Вас есть вот такое меню:

Тогда JavaScript может выглядеть следующим образом:
var ml = new YMaps.YMapsML("урл");
map.addOverlay(ml);

// Обработчик успешной загрузки YMapsML
YMaps.Events.observe(ml, ml.Events.Load, function (ml) {

    // Перебор всех ссылок меню
    YMaps.jQuery("#menu li a").each(function (index) {
   
        // Навешивание обработчика на щелчок по пункту меню
        var item = YMaps.jQuery(this).bind("click", function () {
       
            // Ищем первый элемент, у которого id совпадает с id пункта меню
            ml.filter(function (obj) {
                return obj.id == this.id;
            }, this)[0].openBalloon();

            return false;
        });
    });
});

Также посмотрите похожие примеры из документации:
Как создать элемент управления "Путеводитель по офисам"
Как использовать плавное перемещение центра карты,
Управление группами объектов с помощью меню.
Спасибо, действительно нехватало этого, Навешивание обработчика на щелчок по пункту меню var item = YMaps.jQuery(this).bind("click", function () { точнее это было, но не в основном обработчике, а отдельным скриптом, потому работало независимо.
Кстати в догонку, не совсем в тему но как следствие))) При открытии балууна по пункту меню, GIF анимационный замирает и больше не мигает???? Не знаешь с чего это и как бороться?