Как проверить, загружен ли фрейм с помощью javascript? - не onload, не iframe

проблема: старое программное обеспечение базы знаний, которое по какой-либо причине имеет ссылки, которые сломаны. Это серия вложенных фреймов. Некоторые указывают на правильную цель, некоторые нет, и многие просто сломаны. Это делает использование базы знаний громоздким, когда она не работает гладко

что я пытаюсь acomplish: Я хочу определить, когда конкретный фрейм загрузился, а затем проанализировать документ фрейма, заменив теги привязки на правильный hrefs и цели.

ресурсы и ограничения: у меня есть доступ к некоторым из .страница ASPX. Я нацелился теперь содержит framset, который загружает документ в базе знаний. Src этого кадра, однако, не представляется фактическим .aspx page (physical file) - не уверен, как он генерируется и как хранятся документы. Я вижу список src, но не могу найти его на веб-сервере, к которому у меня есть доступ.

базовый info: страницы загружаются с помощью .aspx (я не понимаю части этого хорошо и не имею доступа ни к чему намного глубже). Этот.страница aspx имеет набор фреймов, который создается при загрузке страницы.

пример кода набора кадров из .файл aspx:

    <FRAMESET id="FrameSetMainView" runat="server" border="0" framespacing="0" frameborder="0">
    <!-- This frame set is defined and generated in the code -->
    </FRAMESET>

Я попытался добавить onload в FRAMESET тег (это приводит к ошибке страницы при попытке загрузки). Набор фреймов берет на себя тело, поэтому я не могу добавить встроенный скрипт в нижнюю часть страницы, чтобы запустить его после заряжаю тоже.

дополнительно, б / к возраста продукта-он принужден в режим совместимости. Поэтому должна использоваться эквивалентная поддержка IE7. (нет )

Текущая Стратегия: что я думаю, что я могу работать, но чувствует себя хитрым, как все - добавление скрипта в <head>. Что-то вроде:

    <SCRIPT>
    function load(){
        var frameset = window.frames;
        if(frameset.length > 0){ // frames have loaded - commence replacement

        }else{ // frames not loaded
            setTimeout(load,1000); // wait 1 sec, try again
        }
    }

    load();
    </SCRIPT>

других решений?

1 ответов


используйте событие onreadystatechange

Да, есть надежный способ решить эту проблему, не прибегая к таймерам или другим ТИКам. При загрузке страницы назначьте обработчик каждому событию фрейма "onreadystatechange". И вы также должны вызвать его один раз, чтобы убедиться, что он применяется к фреймам, которые уже загружены. Приведенный ниже код был протестирован в режимах совместимости IE 5,7,8,9,10 и работал так, как ожидалось (сбой в IE11). Он также был испытан с медленными рамками нагрузки без проблема.

ссылки:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=7" />
  <title>Demo</title>
  <script type="text/javascript">
    window.onload = function() {
      for (var i = 0; i < window.frames.length; i++) {

        (function(frame) {

          // called whenever a frame is loaded or reloaded
          frame.onreadystatechange = function() {
            if (frame.readyState === 'complete') {
              updateLinks(frame);
            }
          }

          // call once to apply to already loaded frames
          frame.onreadystatechange();

        })(window.frames[i].frameElement);
      }
    }

     // modify the links within the frame
    function updateLinks(frame) {
      var i, links, doc;
      doc = frame.contentDocument || frame.contentWindow.document;
      links = doc.getElementsByTagName('A');
      for (i = 0; i < links.length; i++) {
        // modify the links here
        links[i].href += '?time=' + (new Date()).getTime();
      }
      console.info('modified ' + links.length + ' links in frame ' + frame.src);
    }
  </script>
</head>
<frameset cols="*,*">
  <frame src="frameLeft.html">
    <frame src="frameRight.html">
</frameset>

</html>