Клуб API Карт

Создаются точки при перемещении карты а не при клике

upwards
26 марта 2011, 15:42

Привет, перерыл весь поиск, но так и не нашел ответа.

Проблема в следующем, после удаления точки из группы, при последующем
перемещении карты, новые точки создаются не по клику, а именно
по перемещению карты, до удаления точек все отлично, вот живой пример:
http://agp.lifeprom.com/add_point.php

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

// счетчик в 0
counter = 0;

YMaps.jQuery(function () {

    // Создаем группу
    points = new YMaps.GeoObjectCollection("default#whitePoint");

    // Создание экземпляра карты и его привязка к созданному контейнеру
    map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);

    // Установка для карты ее центра и масштаба
    map.setCenter(new YMaps.GeoPoint(36.228644, 50.006063), 13);

    map.addControl(new YMaps.TypeControl());
    map.addControl(new YMaps.Zoom());
    map.addControl(new YMaps.ScaleLine());

    map.enableScrollZoom();

    options = {draggable: true};

    // Создаем точку на карте по клику мыши
    YMaps.Events.observe(map, map.Events.Click, function (map, mEvent) {

        coord_start = mEvent.getGeoPoint();
        coord_x = coord_start.getX();
        coord_y = coord_start.getY();

        var placemark = new YMaps.Placemark(mEvent.getGeoPoint(), options);

        var geocoder = new YMaps.Geocoder(new YMaps.GeoPoint(coord_x, coord_y), {results: 1});

        // Обработчик успешного завершения процесса геокодирования
        YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
            if (this.length()) {
                geoResult = this.get(0);

                getOptions(geoResult);

                placemark.description =  coord_start;
                placemark.setIconContent(descr_r);

                add_point(coord_start, descr_result);
                points.add(placemark);
                map.addOverlay(points);

                drag(placemark);

                counter++;

            } else {
                alert("Nothing found")
            }
        });

        // Процесс геокодирования завершен неудачно
        YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error) {
            alert("Error: " + error);
        });

    });

});

// Функция для отображения результата геокодирования
// Параметр value - адрес объекта для поиска
function showAddress (value) {

    // Запуск процесса геокодирования
    var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});

    // Создание обработчика для успешного завершения геокодирования
    YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
        if (this.length()) {
            geoResult = this.get(0);

            coord = geoResult.getGeoPoint();

            getOptions(geoResult);

            var placemark = new YMaps.Placemark(coord, options);
            placemark.description = coord;
            placemark.setIconContent(descr_r);

            add_point(coord,descr_result);
            points.add(placemark);
            map.addOverlay(points);
            map.setBounds(geoResult.getBounds());

            counter++;

            drag(placemark);

        } else {
            alert("Nothing found")
        }


    });

    // Процесс геокодирования завершен неудачно
    YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error) {
        alert("Error: " + error);
    });
}

// Получение имени и описания точки
function getOptions(geoResult) {
    descr = geoResult.text;
    descr_arr = descr.split(", ");
    if (!descr_arr[4]) descr_arr[4] = "";
    if (descr_arr[5]) descr_arr[5] = ", "+descr_arr[5]; else descr_arr[5] = "";
    if (!descr_arr[4] && !descr_arr[5]) descr_result = descr_arr[3];
    else descr_result = descr_arr[4]+descr_arr[5];
    if (!descr_result) descr_result = descr_arr[2]

    descr_r = '<div id="pointmap-'+counter+'"><nobr>'+descr_result+'</nobr></div>';
}

// перетаскивание точки
function drag(placemark) {

    YMaps.Events.observe(placemark, placemark.Events.Drag, function (obj) {
        coord = obj.getGeoPoint();
        integ = obj.getIconContent();
        integ = integ.split('"');
        integ = integ[1].split('-');
        integ = integ[1];

        $("#point-"+integ+" .coord").html("<div>"+coord+"</div>");
    });

    YMaps.Events.observe(placemark, placemark.Events.DragEnd, function (obj) {
        // Устанавливает содержимое балуна
        coord = obj.getGeoPoint();
        integ = obj.getIconContent();
        integ = integ.split('"');
        integ = integ[1].split('-');
        integ = integ[1];
        placemark.description = coord;

        $("#point-"+integ+" .coord").html("<div>"+coord+"</div>");
        $(".coord-"+integ).attr("value", coord);
        obj.update();
    });

}

// Добавление точки в левую колонку
function add_point(coord,descr_result) {
    text = '<li id="point-'+counter+'"><div class="close"></div><form onsubmit="closeEdit();return false;"><div class="name"><input name="name-'+counter+'" type="text" value="'+descr_result+'" /></div>'+'<div class="coord">'+coord+'</div><input name="coord-'+counter+'" class="coord-'+counter+'" type="hidden" value="'+coord+'" /></form></li>';
    $(text).appendTo(".list-point");
}

// Сбрасываем редактирование
function closeEdit() {
    $(".list-point li").removeClass("edit");
    $(".none").focus();
}

// Общие действия
$(document).ready(function(){

    $(".list-point li").live('click', function() {
        $(this).find(".name input").focus();
    });

    $(".list-point input").live('focus', function(){
        $(this).parents("li").addClass("edit");
    }).live('blur', function(){
        $(".list-point li").removeClass("edit");
        integr = $(this).attr("name");
        integr = integr.split('-');
        integr = integr[1];
        val = $(this).val();
        points.get(integr).setIconContent('<div id="pointmap-'+integr+'"><nobr>'+val+'<nobr></div>');
    });

    // удаляем точку
    $(".close").live('click', function() {
        integr = $(this).parents("li").find(".name input").attr("name");
        integr = integr.split('-');
        integr = integr[1];
        points.remove(points.get(integr));
        $(this).parents("li").remove();
        points.forEach(function (obj, objIndex, group) {
            repl = obj.getIconContent().charAt(18);
            new_name = obj.getIconContent().replace('pointmap-'+repl, 'pointmap-'+objIndex);
            obj.setIconContent(new_name);
        });
        $(".list-point li").each(function(i) {
            $(this).attr("id", "point-"+i);
            $(this).find("input").attr("name", "coord-"+i).attr("class", "coord-"+i);
            $(this).find(".name input").attr("name", "name-"+i).removeAttr("class");
        });
        counter--;
    });

    // изменение размера объектов
    function resize_all() {
        h = $(window).height()-175;
        w = $(window).width()-340;
        $(".points").css({height: h});
        $(".map").css({height: $(window).height(), width: w});
    }

    $(window).resize(function(i){
        resize_all();
    });
});
Спасибо за помощь)
4 комментария
Подписаться на комментарии к посту

а если запревентить баблинг в live?

 

.live("click", function(event){
  event.preventDefault();
});

 

если правильно вас понял, то так:

    $(".close").live('click', function(event) {
        event.preventDefault();
но не помогает, фаербаг вот все равно ругается:

 

this._map is null

Скорее всего проблема в том, что вы несколько раз добавляете группу на карту. Добавляйте ее сразу после определения, 1 раз.

большое вам спасибо) действительно помогло, почему то подумал, что без дополнительного добавления группы на карту и точка не добавится)