Почему мой Iframe загружает свою страницу дважды?

Когда я впервые попадаю на главную страницу, скрипач показывает загрузку сайта iframe один раз. Когда я нажимаю F5 или возвращаюсь на страницу, кажется, что сайт загружается дважды.

Fiddler показывает, что в первый раз есть символ, означающий, что он был прерван.

Iframe загружает страницу дважды - это действительно проблема?

Объяснение точек на изображении

  1. В первый раз, когда страница загрузилась, страница iframe загрузилась нормально (в данном случае это страница ASP, но это происходит для страниц, отличных от ASP).
  2. При обновлении страницы F5 это моя проблема; страница загружается, но похоже, что она была прервана. Я пытаюсь понять почему. Это вообще проблема? Приведет ли это к использованию дополнительных ресурсов на клиенте / сервере?
  3. Затем страница загружается нормально.

Мой IFrame выглядит так:

<div class="IframeContainer">
    <iframe class="IframeContent" ng-src="{{::trustSrc(ActiveLink)}}" iframe-onload="iframeLoadedCallBack()" frameborder="0" scrolling="no"></iframe>
</div>

У меня есть наблюдатель в ActiveLink, и он меняется с неопределенного на определенный только один раз. Однако я добавил запись в функцию trustSrc, и, похоже, она вызывается 3 раза. Пока не знаю почему.

Iframe добавляется как URL-адрес шаблона в app.js как таковой:

.state('Retrieved', {
      url: '/Retrieved',
      templateUrl: 'Scripts/AngularJs/Views/_GenericIframeContainer.html'
  })

Я думаю, что из-за того, что iframe использует ng-src, переменная проходит цикл дайджеста и оценивается. Может быть, эта оценка вызывает перезагрузку iframe?


person Sniipe    schedule 19.04.2017    source источник
comment
было бы полезно отредактировать свой вопрос и добавить код   -  person mlegg    schedule 19.04.2017


Ответы (1)


Исправление заключалось в изменении файла angular JS (версия 1.4.9), который мы используем. Около строки 20365 мы заменили следующие

attr.$set(name, value);

с (что добавляет задержку 10 мс)

setTimeout(function () {
   attr.$set(name, value);
}, 10);

Мы также изменили

if (msie && propName) element.prop(propName, attr[name]);

с

if (msie && propName && element[0].tagName !== 'IFRAME') element.prop(propName, attr[name]);

Так что это, вероятно, проблема только IE. Тот же код есть в AngularJS 1.6.4

Похоже, проблема решена здесь: https://github.com/angular/angular.js/issues/9843, но исправления не было, ИМО.

person Sniipe    schedule 28.04.2017
comment
Проблема с этим решением сейчас в том, что я хочу знать, когда загружается страница iframe. iframe-onload = iframeLoadedCallBack () вызывается дважды. Как ни странно, Fiddler показывает только один вызов запрошенной страницы в iframe. - person Sniipe; 02.05.2017