TypeError: Не удается прочитать набор фреймов свойства 'getElementById'

У меня есть простой код, который обновляет главную страницу каждый раз, когда появляется новая версия, но он работает только в Internet Explorer. В других браузерах я получаю следующую ошибку:

Uncaught TypeError: Cannot read property 'getElementById' of undefined line 24

Вот мой код:

    <html>

    <script type="text/javascript">
     var num=0;
     var currVersion;
     var started=false;

     function startLoad() {
     var url= "version_telemark.html?"+ (++num);
        window.version.navigate(url);
     }

     function endLoad() {
       if (started) {
         var newVersion = version.document.getElementById("version").value;
         if (newVersion != currVersion) {
           currVersion=newVersion;
           var url  = "telemark.html?"+ (++num);
             window.pane.navigate(url);
         }
       }
     }
     function start() {
        currVersion = version.document.getElementById("version").value;
       started=true;
       setInterval("startLoad()", 200);
     }
    </script>

  <frameset    onload="start()"  cols="40%,100%">
    <frame id="version"   src="version_telemark.html"/>
    <frame id="pane" src="telemark.html" />
  </frameset>

</html>

и в моем другом файле у меня есть только то, что я хочу отредактировать:

<input id="version" name="version" type="textbox" value="700">

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


person Henrique Alves    schedule 12.12.2014    source источник
comment
Просто FWIW, frameset больше не является частью спецификации HTML.   -  person T.J. Crowder    schedule 12.12.2014
comment
Видите ли вы какие-либо другие ошибки при запуске приложения с открытой консолью инструментов разработчика? (Возможно, вам будет запрещен доступ к документу фрейма из соображений безопасности.)   -  person hon2a    schedule 12.12.2014
comment
В хроме он отправляет мне эту ошибку: Uncaught TypeError: невозможно прочитать свойство getElementById неопределенного   -  person Henrique Alves    schedule 12.12.2014
comment
Что ж, ошибка, которую вы получаете, означает, что version.document не существует.   -  person hon2a    schedule 12.12.2014


Ответы (1)


Две вещи:

  1. Ваш код полагается на автоматический глобальный код, который браузеры создают для элементов, на которых есть id, используя version в качестве глобальной переменной без ее объявления или инициализации. Возможно, по какой-то причине автоматический глобальный не работает в браузерах, отличных от IE. Я все равно не люблю на них полагаться, их слишком легко скрыть, поэтому я предлагаю получить элемент специально, добавив это в начало вашего скрипта:

    var version = document.getElementById("version");
    

    Но ваш комментарий к вопросу предполагает, что это не это, а № 2 ниже:

  2. Вам может понадобиться vesrion.contentDocument, а не version.document в ваших currVersion = version.document.getElementById("version").value; и подобных строках; возможно, необычайно мощный оператор || в JavaScript:

    var versionDoc = version.document || version.contentDocument;
    // ...and then
    currVersion = versionDoc.getElementById("version").value;
    // ...and so on
    

Примечание: просто чтобы сохранить себя и всех, кто будет поддерживать код после вас, в здравом уме, я бы также предложил разные значения id для version frame и version input внутри него.

person T.J. Crowder    schedule 12.12.2014
comment
после этого он показал мне новую ошибку: Uncaught SecurityError: Не удалось прочитать свойство «contentDocument» из «HTMLFrameElement»: заблокировал доступ кадра с исходным значением null к кадру с исходным значением null. Протоколы, домены и порты должны совпадать. - person Henrique Alves; 12.12.2014
comment
@HenriqueAlves: это означает, что вы делаете это с локальным файлом, а не с чем-то, что обслуживается веб-сервером (в вашей адресной строке URL-адрес начинается с file://). Некоторые браузеры, такие как Chrome, применяют политику единого источника к локальным ресурсам и применяют ее так, как если бы все локальные ресурсы были из разных источников (тем самым запрещая доступ). Если вы загрузите его с веб-сервера (например, localhost в целях разработки), источники будут совпадать, а этого не произойдет. Всегда лучше тестировать веб-материалы через веб-сервер, а не с file:/// URL-адресами. - person T.J. Crowder; 12.12.2014
comment
мне так плохо от всего этого, но теперь он говорит о другой ошибке: Uncaught TypeError: невозможно прочитать свойство «навигация» неопределенного в строке 10 - person Henrique Alves; 12.12.2014
comment
@HenriqueAlves: вам, вероятно, нужно contentWindow для этого бита: window.pane.contentWindow.navigate(url); - person T.J. Crowder; 12.12.2014
comment
@HenriqueAlves: Что ж, как и в случае с version, этот код полагается на автоматический глобальный код. Я бы тоже переключил на getElementById. Ничего не остается, кроме как пройтись с отладчиком, встроенным в ваш браузер, проверить объекты во время выполнения вашего кода и т.д. и т.п. Удачи, - person T.J. Crowder; 12.12.2014
comment
думаю, мне придется найти лучший способ, ну, мы попытались - person Henrique Alves; 12.12.2014