OpenLayers: двойной unselect в Chrome

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

OpenLayers: двойной unselect в Chrome

Сообщение J_Mnemonic » 23 июл 2013, 22:22

Всем привет!
Странное дело у меня опять:
есть функции

Код: Выделить всё

        // Функция центрирования объекта
        function objectCentred(lon, lat, id) {
            // если popup окно открыто, закрываем его
            if (selectedFeature !== undefined) {
                selectControl.unselect(selectedFeature);
            }

            var ll = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
             for (var i = 0; i < features.length; ++i) {
                if (features[i].attributes.Id === id) {
                    markerLayer.addFeatures(features[i]);
                    previousZoom = map.getZoom();
                    map.setCenter(ll, 10);
                    selectControl1.activate();
                    selectControl1.select(features[i]);
                    return;
                }
            }
        }
и
        function onFeatureUnselect(feature) {
            alert(11);
            if (feature.popup !== null) {
                map.removePopup(feature.popup);
                feature.popup.destroy();
                feature.popup = null;
            }
            if (!selectedFeature.cluster) {
                markerLayer.destroyFeatures(selectedFeature);
                selectControl1.deactivate();
            }
            selectedObjectID = -1;
            selectedFeature = undefined;
        }
Тоесть суть objectCentred - закрывать текущий popup и выбирать новый фьючер (из списка закрываемого popup)
Проблема в том, что почему то срабатывает 2 раза событие unselect (это мне понятно по алерту) . Причём второй раз оно почемуто срабатывает после selectControl1.select(features); и поэтому закрывает новый popup :(
Если эту стоку закоментить (selectControl1.select(features)), то один раз срабатывает.
вот функция выбора объекта - ничего особенного

Код: Выделить всё

        function onFeatureSelect(feature) {
            selectedFeature = feature;
            var popupText = "<div><Label>";
            var orderedFeauters = [];
            if (!feature.cluster) {
                Service.GetObjectInfo(feature.attributes.Id, showObjectInfo, onFailure);
                return false;
            }
а если закомментить эту - selectControl.unselect(selectedFeature); о вообще ни разу не срабатывает, и в итоге у меня 2 открытых popup :(
Ничё не понимаю...
Происходит это только в Chrome. в ИЕ - всё ок.
Есть идеи?

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: двойной unselect в Chrome

Сообщение J_Mnemonic » 23 июл 2013, 22:28

ощущение, что выбор фичи, каким то образом заставляет ещё раз выполниться unselect старой фичи. а скорее всего как будто unselectAll как то срабатывает. потому что щас повесил unselect для другого контрола, который вообще к другому слою привязан. он тоже сработал...

Да. именно. алертами выяснил что unselect непонятны образом срабатывет при втором вызове onFeatureSelect.
поскольку первый выбор объекта (со списком) выводится этой же функцией, но unselect не срабатывает.
а вот второй раз, когда я генерю выбор, во время alert(3333); новая фича всё ещё выделена, а после странным образом срабатывает unselect. хотя после alert(3333); ничего нет, как видите

Код: Выделить всё

        function onFeatureSelect(feature) {
            selectedFeature = feature;
            var popupText = "<div><Label>";
            var orderedFeauters = [];
            if (!feature.cluster) {
                alert(3333);
                //Service.GetObjectInfo(feature.attributes.Id, showObjectInfo, onFailure);
                return false;
            }
мало того.
я добавил alert(777) после выбора кнтрола. и при нём фича ещё выбрана.. хотя после этого точно уже ничего нет

selectControl1.select(features);
alert(777)
}
}
}

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers: двойной unselect в Chrome

Сообщение Denis Rykov » 24 июл 2013, 04:56

Столько много слов и совершенно ничего не понятно. Создайте рабочий пример на jsfiddle.net, наглядно демонстрирующий вашу проблему. И заканчивайте дебажить алертами, откройте для себя console. Если возникают какие-то непонятки с OpenLayers-ом, то 100% вариант разобраться с этим - заглянуть в исходники. Также в ходе разработки бывает полезно использовать неминифицированную версию OL.
Spatial is now, more than ever, just another column- The Geometry Column.

J_Mnemonic
Участник
Сообщения: 59
Зарегистрирован: 15 июн 2013, 20:47
Репутация: 0

Re: OpenLayers: двойной unselect в Chrome

Сообщение J_Mnemonic » 24 июл 2013, 08:48

Спасибо за советы. :)
Вчера на самом деле разобрался. Методом исключений вычислил, что всё дело было в feature.popup.destroy(); который у меня прописан в unselect-функции. Именно destroy() так странно себя вёл в Chrome.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя