Internet Explorer выдает ошибку на getElementById - PullRequest
0 голосов
/ 14 января 2011

У меня проблемы с некоторым JavaScript, который использует getElementById.Он отлично работает в FF, Safari и Chrome, но IE (8 - не пробовал другие) выручает.

Соответствующий бит html - это div, называемый topnav:

  <div id="topnav">
   ... some HTML ...
  <div>
  <div id="sub_1" class="lowernav">
   ... some HTML ...
  </div>
  <div id="sub_2" class="lowernav">
   ... some HTML ...
  </div>

В моем javascript я хочу найти topnav.Полный код (вплоть до его возврата) выглядит так:

<script>

 window.onload = init();

 function init() {
  // Show current menu
  showCurrentMenu();
 }

 function showCurrentMenu() {
  hideMenus(); // Hide all menus and then show the current one
  topnav = document.getElementById('topnav');
  ... rest of code ...
 }

 function hideMenus() {
  var divlist = document.getElementsByTagName('div');
  for(var ii=0; ii<divlist.length; ii++) {
   if(divlist[ii].className != divlist[ii].className.replace('lowernav','')) {
    divlist[ii].className += ' hidden';
   }
  }
 }

... затем какой-то другой код, которого он еще не достиг ...

Я что-то здесь не так делаю?Это может быть что-то действительно очевидное, но я не вижу этого в жизни!Весь совет очень ценится.

ETA: Хорошо, вот весь код в том виде, в котором он сейчас стоит:

<script>
 window.onload = init;

 function init() {
  // Show current menu
  showCurrentMenu;
  // Attach 'onmouseover' event to main menu items
  topnav = document.getElementById('topnav');
  // Get all items in list
  var menulist = topnav.getElementsByTagName('a');
  for(var ii=0; ii<menulist.length; ii++) {
   menulist[ii].onmouseover = showMenu;
  }

  document.getElementById('mainHomeNav').onmouseout = restoreMenu;
 }

 function restoreMenu(e) {
  var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;
  if (targ.id == "mainHomeNav") {
   showCurrentMenu;
  }
 }

 function hideMenus() {
  var divlist = document.getElementsByTagName('div');
  for(var ii=0; ii<divlist.length; ii++) {
   if(divlist[ii].className != divlist[ii].className.replace('lowernav','')) {
    divlist[ii].className += ' hidden';
   }
  }
 }

 function showCurrentMenu() {
  hideMenus;
  topnav = document.getElementById('topnav');
  // Get all items in list
  var menulist = topnav.getElementsByTagName('a');
  for(var ii=0; ii<menulist.length; ii++) {
   if(menulist[ii].className != menulist[ii].className.replace('thisSection','')) {
    var thisid = menulist[ii].id;
    var thissubmenu = document.getElementById(thisid + '_sub');
    thissubmenu.className = thissubmenu.className.replace(/hidden/g,'');
   }
  }
 }

 function showMenu() {
  hideMenus;
  // show this menu
  var submenu_id = this.id + '_sub';
  var submenu = document.getElementById(submenu_id);
  submenu.className = submenu.className.replace(/hidden/g,'');
 }
</script>

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Проблема

window.onload = init();

Это немедленно вызовет функцию init, а затем использует возвращаемое значение в качестве функции загрузки страницы. Вам нужно:

window.onload = init;

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

2 голосов
/ 14 января 2011

Я нашел проблему - у меня не было 'var' перед 'topmenu'.

Так что вместо

topnav = document.getElementById('topnav');

это должно было быть

var topnav = document.getElementById('topnav');

Спасибо всем за помощь.

0 голосов
/ 14 января 2011

Ваша проблема заключается в следующей строке:

window.onload = init(); // this will CALL init() and assign the return value

Поскольку init ничего не возвращает, window.onload будет undefined.

Теперь причина того, что он не работает в IE, но в других браузерах, состоит в том, что эти другие браузеры, возможно, уже проанализировали часть DOM, и поэтому вызов showCurrentMenu работает.

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

window.onload = init;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...