Uncaught TypeError: Cannot call method 'getElementById' of undefined
Здравствуйте, дорогие прогеры!
Случилась такая ситуация: Есть некая ссылка, которая закрывать / скрывает один див по нажатию на ссылку. В IE все корректно работает, в мозилле и хроме работает только в одном направлении то есть - только скрывает див. По умолчанию див открыт. p.s. смотрел откладчик Хрома, пишет следующее: Uncaught TypeError: Cannot call method 'getElementById' of undefined Сам код: <td><nobr><a class="normal" href="#" onclick="ChangeTree(); return false;"><img id="chek" src="http://is/pict/skrmenu.GIF" align='left' /><span id="checktext"></span></nobr></a></td> <script> var TreeShow = true; var OptsShow = false; var TreeOn = " ";//Показать меню var TreeOf = " "; //Скрыть меню function ChangeTree() { if (TreeShow) { chek.src = "http://is/pict/pokmenu.GIF"; checktext.innerHTML = TreeOn; hidemenu(); } else { chek.src = "http://is/pict/skrmenu.GIF"; checktext.innerHTML = TreeOf; showmenu(); } TreeShow = !TreeShow; } </script> // метод показа дерева навигации function showmenu() { top.document.getElementsByTagName("frameset")[1].cols=frame_cols; top.document.getElementById("outterframe").frameBorder = "no"; top.document.getElementById("outterframe").document.getElementById("frames2").frameBorder = "no"; top.document.getElementById("outterframe").document.getElementById("frames2").Border=5; top.document.getElementById("outterframe").document.getElementById("frames2").frameSpacing=5; top.frames['mainWindow'].focus(); // передаем фокус основному окну } // метод скрытия дерева навигации function hidemenu() { frame_cols=top.document.getElementsByTagName("frameset")[1].cols; top.document.getElementsByTagName("frameset")[1].cols="2,*"; top.document.getElementById("outterframe").document.getElementById("frames2").frameBorder = "no"; top.document.getElementById("outterframe").document.getElementById("frames2").Border=0; top.document.getElementById("outterframe").document.getElementById("frames2").frameSpacing=0; // top.document.getElementById("outterframe").document.getElementById("frames2").style.visibility = 'hidden'; top.frames['mainWindow'].focus(); // передаем фокус основному окну } Заранее, всем откликнувшимся спасибо! |
Подсказка. Свойство document находится в объекте window, у элементов фреймов оно называется contentWindow.
iframe.contentWindow.document PS не делайте выборки одни и те же несколько раз подряд, нашли элемент, сохранили ссылку и пользуйтесь, да и вообще |
poorking, пожалуйста ткните как это сделать, совсем туплю с фреймами...
:thanks: *низкий вам поклон* |
Если я правильно понял что #outterframe это собсна фрейм
top.document.getElementById("outterframe").contentWindow.document.getElementById("frames2") Судя по всему вы в окне ходите взять фрейм и внутри него найти другой фрейм. Да вы не торопитесь, сайт этот прочитайте: статьи, учебник )) |
poorking, х) правильно понимаете )
Я не тороплюсь... :) На сайте я сижу не первый раз, просто регистрироваться было когда лень сейчас же возникла острая необходимость... Спасибо! |
Хм не работает выше указанный код, теперь и в IE не робит)
// метод показа дерева навигации function showmenu() { top.document.getElementsByTagName("frameset")[1].cols=frame_cols; top.document.getElementById("outterframe").frameBorder = "YES"; top.document.getElementById("outterframe").contentWindow.document.getElementById("frames2").frameBorder = "no"; top.document.getElementById("outterframe").contentWindow.document.getElementById("frames2").Border=0; top.document.getElementById("outterframe").contentWindow.document.getElementById("frames2").frameSpacing=0; top.frames['mainWindow'].focus(); // передаем фокус основному окну } // метод скрытия дерева навигации function hidemenu() { frame_cols=top.document.getElementsByTagName("frameset")[1].cols; top.document.getElementsByTagName("frameset")[1].cols="2,*"; top.document.getElementById("outterframe").document.getElementById("frames2").frameBorder = "no"; top.document.getElementById("outterframe").document.getElementById("frames2").Border=0; top.document.getElementById("outterframe").document.getElementById("frames2").frameSpacing=0; // top.document.getElementById("outterframe").document.getElementById("frames2").style.visibility = 'hidden'; top.frames['mainWindow'].focus(); // передаем фокус основному окну } |
Ну много ж чего быть может, вы отладчиком пользоваться учитесь
Uncaught TypeError: Cannot call method 'getElementById' of undefined - значит что объект, в контексте которого вы вызываете метод "getElementById" есть undefined, может документ фрейма еще не прогружен, может еще что, вы б рабочий пример сделали тут, виднее было б, к тому же в методе hidemenu вы все равно ищете document прямо в элементе фрейма. Посмотрите на результат top.document.getElementById("outterframe"). В отладчике же можно посмотреть в любую переменную. К тому же в методе hidemenu вы все равно ищете document не в window а в самом элементе. И сделайте наконец var outterFrame = top.document.getElementById("outterframe"), innerFrame = outterFrame.contentWindow.document.getElementById("frames2") Так ваш код и гибче и производительнее и читабельнее и удобнее для отладки будет. И проследите чтобы на момент поиска одного фрейма в другом, тот другой загрузился, если нет уверенности этом, то повесьте на outterFrame.contentWindow слушатель onload, а в его обработчике уже и делайте выборку #frame2 |
poorking, спасибо! Увы, сюда рабочий вариант кинуть не могу... из-за того что там тьма файлов и адреса придется ставить относительные и не думаю что некоторые файлы я буду в состоянии исправить... Извините.
Итак, вот что я сделал: // метод показа дерева навигации function showmenu() { top.document.getElementsByTagName("frameset")[1].cols=frame_cols; top.frames['mainWindow'].focus(); // передаем фокус основному окну } // метод скрытия дерева навигации function hidemenu() { frame_cols=top.document.getElementsByTagName("frameset")[1].cols; top.document.getElementsByTagName("frameset")[1].cols="2,*"; top.frames['mainWindow'].focus(); // передаем фокус основному окну } в итоге скрыть / открыть работает отлично в Chrome, IE 8, Mozilla. Однако Опера (у меня стоит версия 10.01) не работает. По умолчанию фрейм открыт, по нажатию как и положено он прячется (скрывается), но более не открывается. По сути отчасти вернулась проблема... Как же я благодарен вам профессор - poorking, спасибо :thanks: ! Узнал кое что новое и искренне надеюсь мы с вами добьем эту "казявку"! ^__^ |
А где остальной код? где вы проверяете ширину колонки фрейма с меню? Как в первом посте мудрите? смотрите на первый символ значения аттрибута cols фреймсета, если он равен "2" (как я понял это значение ширины "скрытого фрейма"), то скрыт, иначе открыт
var toggleMenu = (function () { // Ширина фрейма меню var MENU_WIDTH = 200; // Статическая ссылка на фреймсет var frame = top.document.getElementsByTagName("frameset")[0]; return function toggleMenu() { var colsValue = frameset.getAttribute(cols); frameset.setAttribute("cols", ( (colsValue && colsValue.clarAt(0) === "0") ? MENU_WIDTH : "0" ) + ",*") } }()); Например, даже не тестил, потом, повесьте на вашу кнопку на клик этот обработчик. И вообще обосновано ли использование фреймсета? |
ткните пальцем пожалуйста...
|
Часовой пояс GMT +3, время: 16:28. |