removeChild в IE 5.х

crocodile2u

http://vbolshov.org.ru
removeChild в IE 5.х

Прошу прощения у всех за кросспостинг, но, поскольку сейчас мне понадобилась помощь/консультация, а, поскольку тред

http://phpclub.ru/talk/showthread.php?s=&threadid=56581

находится в оффтопе, помощи там ждать придется долго...

Итак, есть таблица (URL: http://4rome.ru/calendar/), она перерисовывается по определенному событию.

Все исправно работает в IE 6, Netscape 7, Opera 7, Mozilla 1.7.2, Galeon 1.2.7

В IE 5.0 и 5.5 странный глюк:

Изначально отрисовывается нормально, но при попытке прокрутить месяц или сменить стиль отображения недели - в общем, при любой перерисовке - падает IE - проверено на двух разных машинах.

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

такой код:
PHP:
this.tbody.removeChild(el);
alert();
[php]
работает на ура. Появляется алерт, удаляется строка таблицы, все ок.

Стоит убрать алерт - падает браузер!

В чем причина - понять просто не могу.
 

MD

Guest
если в try-catch поместить, все равно падает?
 

crocodile2u

http://vbolshov.org.ru
Все равно падает... есть идеи у кого-нибудь? Я уже ничего не понимаю
 

MD

Guest
приведи минимум кода, который роняет ие.
 

SelenIT

IT-лунатик :)
crocodile2u, win98se + ie5.5 sp1 - не падает...

Кстати, нельзя ли пояснить, для чего перед удалением чайлда делается проверка if (el && el.tagName)? Вроде без нее тоже работает неплохо, да и разве есть в массиве детей этого tbody что-то такое, что не надо удалять при перерисовке?

И вообще, большое спасибо за чудесный скрипт!
 

crocodile2u

http://vbolshov.org.ru
Спасибо огромное, что принимаете участие!

Код, кот. роняет Эксплорер (это явно не совсем минимальный кусок, но я уже теяюсь...):
PHP:
    len = this.tbody.childNodes.length;
    if (len && (len > 0)) {
    	for (i = len-1; i >= 0; i--) {
	    	el = this.tbody.childNodes.item(i);
	    	if (el && el.tagName) {
	    	    	this.tbody.removeChild(el);
	    	}
	    }
    }
По поводу проверок на el && el.tagName и т. п.:

На самом деле, изначальный код, написанный под Мозиллу, имхо, гораздо красивше и не грешит такой ерундой - все это появилось в процессе подгонки под осла... Если все заработает как надо, перепишу немного, чтобы ненужных вещей не было.

-~{}~ 29.09.04 16:06:

Originally posted by SelenIT
сrocodile2u, win98se + ie5.5 sp1 - не падает...
Я этому несказанно рад :)

Но IE 5.5 + Windows 2000, а также IE 5.0 + Windows 98 (хм, 98 надо уточнить, может быть, даже 95 - это у наших соседей)
 

MD

Guest
вот так попробуй:
PHP:
while (this.tbody.childNodes.length != 0)
{
  el = this.tbody.childNodes.item(0);
  if (el && el.tagName) {
    this.tbody.removeChild(el);
  }
}
 

broo

Guest
Сразу прошу прощения, если не в тему, а вдруг поможет, но я бы взял и удалил всю таблицу целиком, а не по строчно, а потом бы отрисовал ее заново:

this.parentNode.removeChild(this);

Удалять детей красивше так:

while (this.tbody.firstChild) this.tbody.removeChild(this.tbody.firstChild);
 

crocodile2u

http://vbolshov.org.ru
Я уже не знаю, смеяться или плакать...

не работает! И так не работает, и этак не работает!

Ребята, если кто будет смотреть этот календарик в 5.x IE и он будет работать нормально - пожалуйста, сообщите!

Может, дело не в скрипте??? мож, какой-то сервис-пак не установлен, или еще что-то там... С такой ерундой второй день заморачиваюсь (ну, конечно, не от зари до зари, но все-таки)...

Написать на пхп - раз плюнуть, я его сначала на пхп и написал. Я еще от собственной глупости страдаю - сказал заказчику, что мол будет календарь, и безо всяких перезагрузок, потом объяснил, что такое перезагрузка :)... Теперь он хочет именно такой... Причем он даже не знает, что такая проблема есть, у него 6.0, но под 5-й однозначно надо подгонять.

Любые идеи принимаются! помогу с чем-нибудь, если смогу...

-~{}~ 29.09.04 17:11:

Originally posted by broo
Удалять детей красивше так:

while (this.tbody.firstChild) this.tbody.removeChild(this.tbody.firstChild);
Почему же не в тему? Спасибо за предложение, буду пробовать, хотя почти уверен, что это будет один в один, что предыдущий вариант ((с) MD)
 

MD

Guest
вот кусок нашего работающего кода.
лишнее закоменчено.
PHP:
tbl = document.getElementById('DataTable');
tl = tbl.rows.length;
for (i=0; i < tl; i++)
{
	// if (tbl.rows[0].id != 'LAST_ROW');
	//{
		tbl.deleteRow(0);
	//}
}
 

crocodile2u

http://vbolshov.org.ru
И так - тоже не работает...

Прошу прощения, это я к тому коду, кот. прислал broo.

-~{}~ 29.09.04 17:27:

УРРРАААААА!!!!!!!! Заработало!!!!!!!!

И че я в этот DOM полез с такой простой задачей???

(кстати, все эти функции работы с таблицами/строками/ячейками, ведь тоже наверняка по тому же принципу работают...)

Ну да ладно, спасибо, MD!!!

Всем, кому еще интересна эта "шняжка" - завтра обязательно выложу переписанный вариант.
 

MD

Guest
ну и харашо. :)
правда может перестать работать в каких-то отличных от ИЕ бродилках, ну там если че ветвление сделаешь уже. лишний раз мучать мозги универсальным решением, я бы не стал :)
 

crocodile2u

http://vbolshov.org.ru
Об этом я уже подумал. Поэтому - завтра, а не сегодня :) еще раз спасибо...

Но, кстати, глюк остается глюком - я не нахожу в прежнем варианте ошибок, так что пока остается думать, что это небольшой бажок в Эксплорер (особенно меня поражает эта фишка с alert())

-~{}~ 30.09.04 12:28:

Новая версия календаря, исправленная и дополненная, доступна по тому же адресу ( http://4rome.ru/calendar/ )

ЗЫ: Если кто-нибудь может посмотреть, что творится с этим календарем под IE 4, очень прошу - сообщите...
 

crocodile2u

http://vbolshov.org.ru
Selected dates - возникли из-за специфики моей задачи. Я делал календарь занятости артиста - типа в этот день я уже выступаю там-то и там-то, а в этот- свободен.

Подумав, я решил добавить "циклические" выбранные даты - может пригодиться для помечания праздников.

А "выбранные диапазоны" - это специально, чтобы никто не сделал заказ на выступление в позапрошлом году или там через пять лет...
 
Сверху