Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Гадкий JavaScript :(
 
 автор: GлюК   (25.05.2006 в 23:01)   письмо автору
 
 

Помогите пожалуйста убрать ошибку. Причину я знаю, но не знаю как исправить. Объясню суть, что должно делаться, и где вылетает ошибка. Есть два файлика, назовём их main.html и 123.html. В первом (main.html) такой код:

<HTML>
 <HEAD>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" >
 </HEAD>
 <body>
  <div id="aaa">
  </div>
 </body>
</html>

На эту страничку второй файлик подгружает сообщения по средствам innerHTML. Делается это так:

parent.main.document.getElementById("aaa").innerHTML=soobshenie;

Проблема: в случае если div из main.html не содержит ни одного сообщения то в IE вылетает ошибка - есть null или не являеся объектом. Как устранить эту ошибку???

   
 
 автор: codexomega   (25.05.2006 в 23:41)   письмо автору
 
   для: GлюК   (25.05.2006 в 23:01)
 

У вас на фреймах держаться 2 файла?
> если div из main.html не содержит ни одного сообщения
Это если между тегами <div id="aaa"></div> ничего нет?

   
 
 автор: GлюК   (26.05.2006 в 11:14)   письмо автору
 
   для: codexomega   (25.05.2006 в 23:41)
 

Да нет, не 2 файла их там много. Это Чат!
>Это если между тегами &lt;div id="aaa">&lt;/div> ничего нет?
Да, если ничего нет!

   
 
 автор: RMW   (26.05.2006 в 00:24)   письмо автору
 
   для: GлюК   (25.05.2006 в 23:01)
 

Опять небось по 123.html щёлкаешь? ;)

   
 
 автор: GлюК   (26.05.2006 в 11:18)   письмо автору
 
   для: RMW   (26.05.2006 в 00:24)
 

Всмысле щёлкаю??? Это нулевой фрейм, я по нему никак не щёлкну! Может можно как-нибудь проверить на наличие/отсутсвие содержимого в div'е???

   
 
 автор: RMW   (26.05.2006 в 13:04)   письмо автору
 
   для: GлюК   (26.05.2006 в 11:18)
 

Понятно. Выскажу предположение:
Может быть обращение к диву происходит
раньше чем он успевает загрузиться?
Попробуй например frameset onload="обращение_к_div'у"
Вряд ли пустота/не пустота дива что-то значит, но попробуй
там пробел пропиши <div>&nbsp;</div> тогда по
идее он не будет пустым.

   
 
 автор: GлюК   (26.05.2006 в 21:50)   письмо автору
 
   для: RMW   (26.05.2006 в 13:04)
 

Дак у меня тогда должен тот фрейм (123) загружаться на onload, а как это сделать так, чтобы не искаверкать структуру фреймов??? Т.е. надо, как я понимаю, сделать так: загружаются все фреймы, кроме 123, а потом, после загрузки именно фрейма main начинает загружаться 123, но ведь этот фрейм добавляет сообщения, получается, что если грузится ещё панель смайлов, то main может очень долго грузиться (т.к. он ниже расположен в фреймах), соответственно и сообщений не будет в это время добавлено! Может можно ещё что-нибудь придумать? Например проверить существование div'a можно???

   
 
 автор: RMW   (26.05.2006 в 23:45)   письмо автору
 
   для: GлюК   (26.05.2006 в 21:50)
 

Я думаю проверить существование дива можно так:
if(document.getElementById('id_дива'))
Но сначала разберись в истинной причине ошибки.
Допустим грузится 123 и обращается к фрейму main
который ещё не успел загрузится - это возможная ошибка.
Если так, то можно решить разными способами, зависит от фантазии.
Кстати frameset onload срабатывает после загрузки
всех фреймов определённых в структуре frameset.
Можно использовать onload, онредистейт и онредистейтчейндж (вроде бы:)),
проверку существования объекта и что-нибудь ещё.
Можно фреймы местами поменять, чтобы сначала грузился main
а потом 123 (если порядок загрузки фреймов зависит от их расположения
в frameset).
Тебе виднее, так как ты обладаешь полной картиной происходящей ситуёвины.
Но проблема вроде не очень серьёзна и должна решиться.
Или давай сюда весь код, вместе с frameset'ом.

   
 
 автор: GлюК   (28.05.2006 в 00:09)   письмо автору
 
   для: RMW   (26.05.2006 в 23:45)
 

Нет, код весь я думаю не стоит выкладывать, там просто сильно много прийдётся вырезать :)Переставлять местами пробовал, разницы никакой (у меня main и так почти в самом начале, а 123 предпоследний). Причина уже мне понятна, main грузится медленее чем 123, т.к. там ещё фон грузится.
Так как вы пишите проверить точно не получится, выдаст ту же ошибку.
А если onload'ом воспользоваться, то как??? Я как-то понять идеи не могу. Точнее идея понятна, но как вызвать функцию, которая описана в другом фрейме?

   
 
 автор: RMW   (28.05.2006 в 00:35)   письмо автору
 
   для: GлюК   (28.05.2006 в 00:09)
 

Я не утверждаю, что причина именно в этом, а лишь полагаю.
Функция вызывается вроде так:
<frameset onload= "Имя_фрейма.funkciya()">

Если код из фрейма обращается к главному окну то:
top.somefunction()

   
 
 автор: GлюК   (28.05.2006 в 22:04)   письмо автору
 
   для: RMW   (28.05.2006 в 00:35)
 

Всё понял, но вот чёт в моём случае мне не удаётся сделать так, чтоб всё работало. Получается, что нужно абсолютно по-новому всё переделать, всю мою систему обработки сообщений!
А в JS случайно нет никакого экрана, типа @ в php???

   
 
 автор: RMW   (29.05.2006 в 00:44)   письмо автору
 
   для: GлюК   (28.05.2006 в 22:04)
 

Про экраны не знаю.

Проверить существование дива всё-таки
можно так:

if(document.getElementById)
{
  if(document.getElementById('id_элемента'))alert('есть');
  else alert('нет');
}

Но учитывая, что "(innerHTML) Данное свойство не может быть изменено во время загрузки документа"проверка может оказаться бесполезной.

Не обязательно использовать frameset onload
можно сделать в "main" <body onload="parent.123.функция_добавления()">

   
 
 автор: GлюК   (29.05.2006 в 23:41)   письмо автору
 
   для: RMW   (29.05.2006 в 00:44)
 

Проверка работает! Я делаю такую вещь:

a=0;
while (a<1)
       {
       if(parent.main.document.getElementById)
          {
          if(parent.main.document.getElementById('aaa'))
             {
             a=1;
             alert("Есть");
             }
          else
              {
              alert("Нет");
              }
          }
       }

притормаживаю скрипт.
Вот только возникает ещё одна проблемка: если я делаю с алертами то мне выдаётся сообщение, "Нет", как и должно быть, а потом "Да", и всё работает нормально после этого, но если я убираю alert'ы то происходит зацикливание (если конечно div'a нет)! Как это исправить?

   
 
 автор: RMW   (30.05.2006 в 20:47)   письмо автору
 
   для: GлюК   (29.05.2006 в 23:41)
 

Ну, если продолжать идти по этому пути, то
можно попробовать следующее

var StopTimer;

if(document.getElementById)f();

function f()
{
  if(parent.main.document.getElementById('aaa'))
  {
    try
    {
      parent.main.document.getElementById('aaa').innerHTML= 'тестируем';
    }
    catch(err)
    {
      alert('Упс!\n'+err.description);
    }

    if(StopTimer)window.clearTimeout(StopTimer);
    return;     
  }

  if(parent.main.document.readyState == 'complete')
  {
    if(StopTimer)window.clearTimeout(StopTimer);
  }
  else
  {
    StopTimer = window.setTimeout('f()',250);
  } 
}

Этот код предназначен в основном для отладки, проверки.
Суть действа в следующем:

Создаём переменную StopTimer
Если браузер поддерживает getElementById - запускаем функцию f()
Если получем объект с id = "aaa" - устанавливаем в качестве значения innerHTML
строку "тестируем". Если при этом возникают проблемы выводим "Упс!"+ описание ошибки.
Если всё получается - выходим из функции.
Если id="aaa" нету, проверяем не загрузился ли фрейм main,
если не загрузился ждём 1\4 сек. и снова запускаем f().
Если main загрузился останавливаем таймер и функция завершается.

   
 
 автор: GлюК   (31.05.2006 в 00:47)   письмо автору
 
   для: RMW   (30.05.2006 в 20:47)
 

А этот способ уже не подходит! В первом проходе вылетает Требуется объект, а во втором всё проходит без ошибок, а потом уже где-то ниже по коду выдаётся всё таже ошибка (есть null...)! Хоть это подобный способ, но нельзя ли как -то тот переделать, чтоб без алертов? С помощью setTimeout, почему-то у меня не получилось, всё-равно зацикливается! Но с алертами работает всё замечательно!

   
 
 автор: GлюК   (01.06.2006 в 19:51)   письмо автору
 
   для: GлюК   (31.05.2006 в 00:47)
 

RMW, может я вам исходники пришлю на мыло??? Посмотрите пожалуйтса!!!

   
 
 автор: RMW   (01.06.2006 в 20:24)   письмо автору
 
   для: GлюК   (01.06.2006 в 19:51)
 

Посмотреть то я посмотрю, мне не жалко :) ,
но обещать ничего не обещаю, хотя бы потому,
что у меня на локале твои фреймы будут грузиться
моментально, и мне не удастся смоделировать проблему.
Если это дело у тебя уже выложено в сети,
то лучше линк. А ещё лучше убрать всё лишнее,
оставить главное, в сеть и линк.
Но в принципе присылай.

И ещё скажи
>В первом проходе вылетает Требуется объект
Это вылетает в дилоговом окне алерт с надписью "Упс!" ?

> а потом уже где-то ниже по коду выдаётся всё та же ошибка (есть null...)
Потом это когда и где и с чем связано?С тем же самым,
или эта ошибка уже из другой э-э, пьесы?

   
 
 автор: GлюК   (01.06.2006 в 22:50)   письмо автору
 
   для: RMW   (01.06.2006 в 20:24)
 

В первом проходе вылетает Упс! Ошибка таже, но где-то ниже! Мне тогда мыло нужно! И у меня то тоже на локалке! Я пришлю полностью чат (он почти пуст, там сделана толко система добовления сообщений!) В письме всё объясню!

   
 
 автор: RMW   (01.06.2006 в 23:02)   письмо автору
 
   для: GлюК   (01.06.2006 в 22:50)
 

Мыло есть в профиле, щёлкни по нику.

   
 
 автор: GлюК   (01.06.2006 в 23:09)   письмо автору
 
   для: GлюК   (01.06.2006 в 22:50)
 

Письмо отправил!

   
 
 автор: RMW   (02.06.2006 в 22:56)   письмо автору
 
   для: GлюК   (01.06.2006 в 23:09)
 

для GлюК

Результат пока отрицательный, пхп я не знаю.
Проверь ящик.

   
 
 автор: GлюК   (04.06.2006 в 23:02)   письмо автору
 
   для: RMW   (02.06.2006 в 22:56)
 

В том-то и проблема, с "белыми" страничками всё работает нормально, т.к. не приходится в main загружать картинку (фон)! Ладно, не забивайте себе голову, буду сам разбираться!!!

   
 
 автор: OlegBu   (28.05.2006 в 13:51)   письмо автору
 
   для: GлюК   (25.05.2006 в 23:01)
 

Проблема не в JavaScript, а в DOM.
Все современные браузеры используют данную модель представления объектов в документе.
По определению, "innerHTML (IE4+, NS6+)- строка, доступная на чтение/запись, определяющая обычный (plain) текст внутри элемента DOM, исключая открывающий и закрывающий теги самого элемента. Изменение значения данного свойства приводит к изменению содержимого элемента без разбора данного текста (parsing plain text). Данное свойство не может быть изменено во время загрузки документа."
С помощью данного свойства современные браузеры позволяют создавать дочерние элементы (хотя по определению и не должен происходить разбор содержимого) однако, для совместимости кода с последующими браузерами следует избегать данного приема. Более правильно использование явного создания DOM-элементов, c их последующей вставкой в документ, посредством методов: createDocumentFragment(), createElement(), createTextNode(), createCaption(), createTFoot(), createTHead(), etc... с последующим appendChild(), cloneNode(), inserBefore(), replaceChild(), importNode(), insertRow(), etc...
В Вашем конкретном случае действительно: при "пустом" теге <div>, в ответ на действие с innerHTML может выдаваться такое сообщение. Это не самое плохое- хуже то, что разные браузеры в Вашем случае ведут себя неодинаково: кто-то создает текстовый узел, кто-то создает только текст, причем текст может быть как пустым (IE6), так и содержащим whitesymbols (пробелы, табуляцию, перевод строки etc- FireFox)!- это свобода браузера. Проверить можно, например, так:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" >
<script language="javascript" type="text/javascript">
<!--
function fn() {
alert(typeof (document.getElementById("aaa").innerHTML)+'\n'+
(document.getElementById("aaa").innerHTML==="")+'\n'+
(document.getElementById("aaa").innerHTML===null)+'\n'+
(document.getElementById("aaa").innerHTML===undefined)+'\n'+
escape(document.getElementById("aaa").innerHTML))
document.getElementById("aaa").innerHTML="<span>aaa</span>"
alert(typeof (document.getElementById("aaa").innerHTML)+'\n'+
(document.getElementById("aaa").innerHTML==="")+'\n'+
(document.getElementById("aaa").innerHTML===null)+'\n'+
(document.getElementById("aaa").innerHTML===undefined)+'\n'+
escape(document.getElementById("aaa").innerHTML))
}
//--></script>
</HEAD>
<body onload="fn();">
<div id="aaa">
</div>
</body>
</html>

В Вашем случае правильное обращение к содержимому div'а может выглядеть так:
document.getElementById("aaa").firstChild
вопросы:
Олег, modul%40col.ru

   
 
 автор: GлюК   (28.05.2006 в 21:59)   письмо автору
 
   для: OlegBu   (28.05.2006 в 13:51)
 

Олег, вы маленько неправильно поняли, нужно проверить существует ли div в другом фрейме (просто тот фрейм к моменту проверки может ещё не загрузиться и поэтому проверка, выше вами описаная, не сработает! Выдаст что требуется объект.)

   
 
 автор: OlegBu   (29.05.2006 в 21:02)   письмо автору
 
   для: GлюК   (28.05.2006 в 21:59)
 

я отвечал на
Проблема: в случае если div из main.html не содержит ни одного сообщения то в IE вылетает ошибка - есть null или не являеся объектом.
для проверки данных другого фрейма
document.getElementById("aaa").innerHTML
надо заменить (как у Вас по тексту) на
parent.main.document.getElementById("aaa").innerHTML

особенно обращаю внимание, что document.getElementById("aaa").innerHTML в IE
 
  <div id="aaa">
  </div>

действительно пуст, в то время как в Mosilla's он содержит символы перехода на новую строку и пробелы!

проверить существует ли объект с Id "aaa" можно на <<неложность >> parent.main.document.getElementById("aaa")
 
  try (!parent.main.document.getElementById("aaa")) ...

   
 
 автор: GлюК   (29.05.2006 в 23:42)   письмо автору
 
   для: OlegBu   (29.05.2006 в 21:02)
 

Про try я что-то ничего не понял (я не знаю как ето работает, и что дальше писать), но всё-равно кажется, что будет та же ошибка. В моём случае получается, что таким образом parent.main.document.getElementById("aaa") мы обращаемся к пустой странице, ну может и не совсем пустой, но div'ом там и не пахнет! В итоге он пытается найти, то чего нет и выдаёт ошибку, что такого объекта нет!
Может вы знаете, есть ли в JS экран, что-то типа @ в php?
Проверка RMW работает! Прочитайте мой пост, который выше, может вы что ответите!

   
 
 автор: OlegBu   (30.05.2006 в 12:58)   письмо автору
 
   для: GлюК   (29.05.2006 в 23:42)
 

try/catch/finaly -оператор JavaScript обработки исключений.

Описание- в книжках по JavaScript. Самая лучшая, на мой взгляд- David Flanagan. JavaScript The Definitive Guide, Fourth Ed. OReilly, Jan.2002 ISBN 0-596-00048-0
http://anatolix.naumen.ru/Books/JS20Ref?show_comments=1, оказывается, уже есть на русском:
JavaScript. Подробное руководство, 4-е издание
Символ-Плюс май 2004 ISBN 5-93286-055-3
http://www.symbol.ru/search?query=5-93286-055-3+
http://www.books.ru/shop/books/139286

RMW предложил другой верный подход .
Раз он работает, т.е. div существует- значит смотрите в корень (т.е. в определение свойства iinerHTML), c чего я и начинал. Т.е. в Вашем случае проблема не в том, что на момент обращения div не существует, а в том что Вы пытаетесь выполнить нечто недопустимое. Например, присваивание свойству iinerHTML значения неприводимого типа (пустой строке объект и т.д.).

JavaScript не относится к языкам со строгой типизацией, т.е. в выражениях используется неявное преобразование типов, определяемое операцией и типами операндов. Хотя преобразования можно задавать и явно( например Number('0.0')).
Существует три элементарных (primitive) типа: numbers, strings и booleans. Помимо этого существует два тривиальных типа null и undefined, имеющих только по одному значению.
В добавление к данным элементарным типам существует составной (composite) тип object, представляющий набор значений. Данный тип в JavaScript имеет двойственную природу: может представлять неупорядоченный набор именованных значений и/или упорядоченный набор нумерованных значений. В последнем случае объект называется массивом, array. Хотя все массивы являются объектами (не наоборот!), они имеют ряд отличий (главное- свойство length), выделяющих их в особый тип. Помимо этого специального вида объекта, существуют и другие специальные объекты: functions (объекты, имеющие исполняемый код, которые могут получать управление для выполнения операций) и некоторые другие специальные виды объектов. Все эти объекты не представляют новых типов, они являются новыми "классами" объектов.
Оператор type of может возвращать только следующие значения: "number", "string", "boolean" (для сооответствующих типов), "object" (для object, arrays, null (!)), "function", для операндов functions и "undefined", если операнд не определен.

   
 
 автор: GлюК   (31.05.2006 в 00:49)   письмо автору
 
   для: OlegBu   (30.05.2006 в 12:58)
 

Нет, проблема то как раз в этом!!! Я имел ввиду, что работает, то что он выдаёт есть или нет div, а другие способы в случае если дива нет, в отличии от этого, выдавали: Требуется объект. Нужно доделать предъидущий способ без алертов!

   
 
 автор: Pavloff.D   (06.06.2006 в 18:01)   письмо автору
 
   для: GлюК   (31.05.2006 в 00:49)
 

Привет Глюк!...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования