Страница 1 из 1

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

Добавлено: 23 июл 2013, 22:22
J_Mnemonic
Всем привет!
Странное дело у меня опять:
есть функции

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

        // Функция центрирования объекта
        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. в ИЕ - всё ок.
Есть идеи?

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

Добавлено: 23 июл 2013, 22:28
J_Mnemonic
ощущение, что выбор фичи, каким то образом заставляет ещё раз выполниться 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)
}
}
}

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

Добавлено: 24 июл 2013, 04:56
Denis Rykov
Столько много слов и совершенно ничего не понятно. Создайте рабочий пример на jsfiddle.net, наглядно демонстрирующий вашу проблему. И заканчивайте дебажить алертами, откройте для себя console. Если возникают какие-то непонятки с OpenLayers-ом, то 100% вариант разобраться с этим - заглянуть в исходники. Также в ходе разработки бывает полезно использовать неминифицированную версию OL.

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

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