0
Реализовано

Перестать переопределять .onload для всех подряд iframe

e 5 years ago updated by Дмитрий Уткин 5 years ago 3

Скрипт https://mc.yandex.ru/metrika/tag.js

f.connectSlaveRecorder = function(a) {
    var c = this;
    if ("IFRAME" === a.nodeName && "ym-native-frame" !== a.name) {
        try {
            var b = 0 < a.contentDocument.documentElement.childNodes.length && "complete" === a.contentDocument.readyState
        } catch (gc) {
            b = !0
        }
        var e = function Hb(a) {
            var b = a.contentWindow
              , e = a.contentDocument;
            if (b && e) {
                if (!0 === b.__YM_WV_RECORDABLE__)
                    return O["default"].warn("Iframe has internal counter installed");
                if (!0 === b.__YM_RECORDING__)
                    return O["default"].warn("We're already recording this iframe", a);
                a.contentWindow.__YM_RECORDING__ = !0;
                b = c._createInstance(c._configOptions, {
                    window: b,
                    document: e
                });
                b.init(c.initOptions);
                b.start(c.startOptions);
                O["default"].info("Recorder injected into the iframe", a)
            } else
                D(function() {
                    return Hb(a)
                }, 10)
        }
          , d = function(a) {
            try {
                var c = !!a.contentWondow && !!a.contentWindow.location
            } catch (Xa) {
                O["default"].warn(Xa),
                c = !1
            }
            c && !0 !== a.contentWindow.__WV_ENABLED__ && e(a)
        };
        a.onload = function() {
            d(a)
        }
        ;
        b && (O["default"].log("Iframe is already loaded"),
        d(a))
    }
}


содержит фрагмент, который переопределяет свойство onload айфреймов, к которым яндекс не имеет отношения. Очевидно, что метрика не должна никоим образом менять то, что я записал своему айфрейму в onload, и код, видимо, нужно поменять на что-то вроде

        a.addEventListener('load', function() {
            d(a)
        });

Answer

Answer

Исправили! 

Answer

Исправили! 

+1

Я не уверен, что так и должно быть:

var c = !!a.contentWondow && !!a.contentWindow.location

Ошибка на 16.07.2019 присутствует в коде.