Клуб API Карт

Совместимость с Ie8 и ниже

Пост в архиве.

добрый день.

Мы используем ваш прекрасный апи на своем сайте http://vp2.uniparx.ru/catalog/area/4454 и у нас возникла проблема с ошибкой в ie8 и ниже, в других браузерах и Ie9 все хорошо.

При включенном режиме debug выдается ошибка

SCRIPT601: Неизвестная ошибка выполнения
combine.xml?modules=dDgygKdxeTdzdpfVllncltlqlylkfbe5jNjMgefwh6h5h8itd1mBmAkkkljZjaiaigl8iuive8jYijife9l9mfmbildvgMd3eNi4i3i7i5i6jqjpjsjrjAjwjzjyjxjjjfjhjejgjojijnjmjkfrfpfmjGfqmymumzmtmxmveleAedkNgpgJdCmYkvgfhteUnmlNlOlLlMeSeshQhPhRnklpmPmNobocovoeoonKonohdJlwfOeEnlnjlulrlzm6nynzd2dSd6d9g7g6g8d5g4d0d8dVkXeJk1lKkYeKdXdUd7dYdRdWmgiAgbf8j1drj2dyeGe4fDguipioinisiqirgamQgwdqfufBhnhmgkmDeFezhrftjJekeodEeBemjKebjLl7h7lRl5l1lPl4l0h3h2lTl6l2f4f7dZd4efjOdAjEjCf3f2f6dukfeHkhfLkgf5f1evdtjPiQiYnQnTi9idikime3eYe7gAfHhshEgri8iwh9maizjdiemejciyibiimdjbixicihmcdLdGdHkZkmeOeMjQfkjBfljtjujvgzmrmsmqdMdPdNjljFdsj0jDgLfUeqeugDgEi2jIfnmwhymUkHkwhkh0eehFhjlmnunrnqnsntnonnnhngnigomOmMoxowoAoBoNoOoMoCoDoFoEoXoQoPoRoWojnJoyoicilxeVgCnplvnGn9n8oanHnIlsnxm5jRj5j3eZe0e1gvkPfXfWj7gqgBeahShThUhVhKhMhIhXhOhWhJg0g5ejdTg3g1k2ePerlJgnfeffhZeXfJhDhlfMhHgcgikFeDe2fakEkKkIepdwfCgxfvfxoqnWnVnYnXmCopnLlYlWlQnPlXl3nNnOlSlZfZkbkckdkieIkjfNfQfIfRfKjSjTj6jXdBj4hhhwhbmIiWfPeghiiOnSmlnRmihziViUiTmpmkiSmnhxiRmmetdFdIdKmZm2m0m3m1m4kpiKf9dQgTdOjHfEfsenexlclelnfzf0olokomhpk6k5c8b3cqbTcXapaxa7fAoYcpogcQadaIbocmbAnDnvfhn1oum9nfn6n7n5nbm8n4nam7nehGlFeWkQgjgdkaj8eReQlIgthLhNg2k3hdiHiChYfyfdhoe6iBkLkGkJewehh1lVnMh4iIkefGmEjVhChufihghfiXi0momjgVi1iPiFfgkUgPjUfogmlflildk9loozoGoIk8k4aAaNc7docAa8cxdcbhcIcGaDbYcla0oZa9cubRcrbJaGcab9nEfcn3n0c6bMaQbOdnb5avnZaWbZbVmTfFmVmWhciNgXlUfjgQkTlaaecDarcwbyoUoSoToVoKcsbqbcbsdlacctcYa4b4bCahdkcFcvbibBbratcTaRdacgdiakaBotn2b2asbXeCeigIlhmLmhgOcjdebuaMbPcRc4bfbQaCbebHcLcObKamczbwa6bShqgUgNljlgcVcfb8ddcobxayblaTcPaaaPhv&jsonp_prefix=ymaps2_0_15, строка 26502 символ 9

 

В чем может быть проблема?

16 комментариев

Я у вас на сайте нашла код в стиле for(k in myMapminimap.geoObjects._ub._io._Ft._Gt.hash).

1. Вы используете непубличные методы и свойства - мы не поддерживаем их сохранность.

2. Странные имена полей - это результаты обфускации - они могут меняться от релиза к релизу. А в дебаг режиме они вообще изменяются на читаемые названия и ваш код не будет работать в дебаге.

3. Вы таким образом обходите наш интерфейс и изменяете объекты напрямую. В 90% случаев это будет вызывать логические ошибки при работе программы.

Спасибо за скорый ответ!

Я бы с удовольствием использовал нормальные имена, но до результата дошел только так(долго бился с интерфейсом безрезультатно). Возможно ли как-то перевести на читаемые имена эти объекты те перейти на ваш интерфейс?

 

Это можно и нужно сделать)

Могли бы вы перевести цикл с перебором коллекций геообъектов

for(k in myMapminimap.geoObjects._ub._io._Ft._Gt.hash)

в нормальный вид, а там я уже сам оттолкнусь и попробую перевести все

Вариант 1.

myMinimap.geoObjects.each(function (geoObject) {

    // это функция-обработчик, она будет получать на вход очередной объект - geoObject

});

 

Вариант 2.

var it = myMinimap.geoObjects.getIterator(),

    obj;

while (obj = it.getNext()) {

    // тут в цикле через итератор перебираем объекты.

    // в переменной obj будет ссылка на очередной элемент

}

Большое спасибо!

 

Добрый день.

Все заменил, кроме одного

    myMap.events.add('balloonopen', function (e) {
    url = '/_snippet/card_data.php?card_id=' + myMap.balloon._ci._i.properties._i['id'];
    $.ajax({
        url: url,
        cache: false
    }).done(function(html) {
        myMap.balloon._ci._i.properties.set({      
           balloonContentBody: html
        });       
        });
    });

здесь осуществляется замена контента балуна, через аякс, используя id его геообъекта. Подскажите как уйти от myMap.balloon._ci._i.properties._i['id']

var id = e.get('target').properties.get('id');

 

Через e.get('target') вы получаете ссылку не геообъект, а потом через его поле properties получаете значение поля id.

к сожелению для этого события target - вся карта, а не геообъект.

Вот что выдает объект  e  сори  за простыню

options: [object Object]

id_1348224601843671: id_134822460184367138288

_w: [object Object]

events: [object Object]

container: [object Object]

converter: [object Object]

panes: [object Object]

_y: 18

_z: mq_ya#hybrid

_A: [object Object]

_B: 40497483.422817186,21355284.447619207

_C: 37.24119234404246,54.78145280359613,37.249668124529514,54.784193620264574

_D: [object Object]

action: [object Object]

layers: [object Object]

_J: [object Object]

zoomRange: [object Object]

copyrights: [object Object]

cursors: [object Object]

behaviors: [object Object]

geoObjects: [object Object]

controls: [object Object]

balloon: [object Object]

hint: [object Object]

hotspots: [object Object]

id_13482246018436713: [object Object]

getCenter: function () {
    return this._A.fromGlobalPixels(this._B, this._y);
}

setCenter: function (e, t, n) {
    n = n || {};
    var r = typeof t == "undefined" ? this._y : Number(t), i = this._A.toGlobalPixels(e, r);
    return this.setGlobalPixelCenter(i, r, n), this;
}

panTo: function (e, t) {
    t = t || {};
    var r = e[0].length ? e : [e], i = [], s = typeof t.flying == "undefined" ? true : t.flying, o = this.container.getSize(), u = [o[0] * 2, o[1] * 2];
    for (var a = 0, f = r.length; a < f; a++) {
        i.push({center: r[a], delay: typeof t.delay == "undefined" ? 1000 : t.delay, zoom: this._y, duration: typeof t.duration == "undefined" ? 500 : t.duration, checkZoomRange: t.checkZoomRange, timingFunction: t.timingFunction || "ease-in-out"});
    }
    var l = this._B;
    for (var a = 0, f = i.length; a < f; a++) {
        var c = i[a];
        c.globalPixelCenter = n.util.math.getClosestPixelPosition(l, this._A.toGlobalPixels(c.center, this._y), this._y, this._A);
        if (!s) {
            var h = [Math.abs(c.globalPixelCenter[0] - l[0]), Math.abs(c.globalPixelCenter[1] - l[1])];
            if (h[0] > u[0] || h[1] > u[1]) {
                c.duration = 0;
            }
        }
        l = c.globalPixelCenter;
    }
    s && (i = n.util.animation.getFlyingTicks(i, this));
    var p = new n.map.action.Sequence(i, {callback: t.callback});
    return p.begin(this.action), this;
}

getBounds: function () {
    var e = this.getGlobalPixelCenter(), t = this.container.getSize(), r = [[e[0] - 0.5 * t[0], e[1] - 0.5 * t[1]], [e[0] + 0.5 * t[0], e[1] + 0.5 * t[1]]];
    return n.util.bounds.fromGlobalPixelBounds(r, this._A, this.getZoom());
}

setBounds: function (e, t) {
    t = t || {};
    var r = n.util.bounds.getCenterAndZoom(e, this.container.getSize(), this._A, t.precizeZoom);
    return this.setCenter(r.center, r.zoom, t);
}

getGlobalPixelCenter: function () {
    return this._B;
}

setGlobalPixelCenter: function (e, t, r) {
    return r = r || {}, this.action.execute(new n.map.action.Single({globalPixelCenter: e, zoom: typeof t != "undefined" ? t : this._y, duration: r.duration || 0, callback: r.callback, checkZoomRange: r.checkZoomRange, timingFunction: r.timingFunction})), this;
}

getZoom: function () {
    return this._y;
}

setZoom: function (e, t) {
    var n = this.getGlobalPixelCenter(), r = Math.pow(2, e - this.getZoom());
    return n = [n[0] * r, n[1] * r], this.setGlobalPixelCenter(n, e, t), this;
}

_x: function (e) {
    var t = this._C, n = e.get("oldOffset"), r = e.get("oldSize");
    this.events.fire("sizechange", new i({oldSize: r, newSize: e.get("newSize"), target: this}), this);
    var s = this._y, o = this.getCenter(), u = this._B;
    if (e.get("preservePixelPosition")) {
        this.action.stop();
        var a = [n[0] + r[0] / 2, n[1] + r[1] / 2], f = this.converter.globalToPage(this._B), l = a[0] - f[0], c = a[1] - f[1];
        this.setGlobalPixelCenter([u[0] - l, u[1] - c]);
    } else {
        this._C = this.getBounds();
        var h = this.getCenter(), p = this._B;
        this.events.fire("boundschange", new i({target: this, oldZoom: s, newZoom: s, oldCenter: o, newCenter: h, oldGlobalPixelCenter: u, newGlobalPixelCenter: p, oldBounds: t, newBounds: this._C}, this));
    }
}

_E: function (e) {
    this.events.fire("action" + e.get("type"), new i({target: this, action: e.get("action"), tick: e.get("tick")}, this));
}

_F: function (e) {
    var t = this.getCenter(), n = this._B, r = this._y, s = this._C;
    this._B = e.get("globalPixelCenter"), this._y = e.get("zoom"), this._C = this.getBounds(), this.events.fire("boundschange", new i({newCenter: this.getCenter(), newGlobalPixelCenter: this._B, newZoom: this._y, oldCenter: t, oldGlobalPixelCenter: n, oldZoom: r, oldBounds: s, newBounds: this._C, target: this}, this));
}

getType: function () {
    return this._z;
}

setType: function (e) {
    var t = this._z;
    return t == e ? this : (t && this._I(), this._z = e, e && this._H(), this.events.fire("typechange", new i({target: this, oldType: t, newType: e}, this)), this);
}

_H: function () {
    var e = typeof this._z == "string" ? n.mapType.storage.get(this._z) : this._z, t = new n.LayerCollection({zIndex: n.constants.zIndex.mapTypeLayer}), r = e.getLayers();
    for (var i = 0, s = r.length; i < s; i++) {
        var o = typeof r[i] == "string" ? n.layer.storage.get(r[i]) : r[i], u = new o;
        t.add(u);
    }
    this._J = t, this.layers.add(t);
}

_I: function () {
    this.layers.remove(this._J);
}

_v: function () {
    this._w.setInteractivityModel(n.interactivityModel.storage.get(this.options.get("interactivityModel"))), this.events.fire("optionschange", new i({target: this}));
}

destroy: function () {
    this._z && this._I(), this.action.events.remove(["begin", "tick", "tickcomplete", "break", "end"], this._E, this).remove("statechange", this._F, this), this.options.events.remove("change", this._v, this), this.container.events.remove("sizechange", this._x, this), this.events.fire("destroy", new i({target: this}, this)), this._D.removeAll();
}

_G: function (e) {
    typeof e == "string" &&
        e.indexOf("yandex#") == 0 &&
        n.util.script.create("https://clck.yandex.ru/jclck/dtype=stred/pid=443/cid=71834/path=" + e.replace("yandex#", "") + "/rnd=" + Math.random() + "/*https://maps.yandex.ru/");
}


Так у вас балун открывается на карте, а не на геообъекте?

нет на геообъекте по клику на нем

 

единственно там сложная структура геообъектов из полигонов и точек

 

возможно ли что при создании события через myMap.events.add('balloonopen', function (e) { }); карта затирает геообъект?

 

Все, я поняла. Вам надо слушать событие не на карте, а на myMap.geoObjects. Тогда в e.get('target') будет геообъект.
Просто все балуны объектов открываются в конечном счете через map.balloon. И поэтому события balloonopen происходят как на объектах, которые открывали балун, так и на карте.

еще раз спасибо за все!