Не удаётся перебрать свойства DOM HTML объекта

ONK

Пассивист PHPСluba
Не удаётся перебрать свойства DOM HTML объекта

Написал я сегодня print_r для Js переменных и столкнулся с проблемой, решить которую не могу, готов сдаться. -(

Суть проблемы в том, что DOM объекты нормально раскрываются только в Опере (вот так, я сам удивлён), а в FF и IE происходит "неизвестная" ошибка при попытке доступа к свойству объекта.

При этом перебор свойств user defined объектов происходит без каких либо проблем во всех браузерах.

Если у кого есть мысли, буду очень благодарен.

Вот тестовый скрипт
PHP:
<html>
<body>
<script language='JavaScript'><!--

function print_r(mVar,iDebugLevel){
	var sOut = '';
	if(iDebugLevel){
		iDebugLevel--;
		switch(typeof(mVar)){
			case 'object':
			case 'array':
				sOut += typeof(mVar) + "{<BLOCKQUOTE>";
				for(key in mVar){
					sOut += "<br>" + "[" + key + " ] = " + print_r(mVar[key],iDebugLevel);
				}
				sOut += "</BLOCKQUOTE>}";
			break;
			case 'string':
				sOut += mVar;
			break;
			case 'number':
				sOut += mVar;
			break;
			case 'boolean':
				sOut += "boolean (" + mVar + ")";
			break;
			case 'function':
				if(0){
					sOut += mVar;
				}else{
					sOut += '...handler source code...';
				}
			break;
			default:
				sOut += typeof(mVar);
		}
	}else{
		sOut += "...";
	}
	return sOut;
}

function debug_var(mVar,iDebugLevel){
	oShowArea     			= document.createElement('DIV');
	oShowArea.style.width 		= 640;
	oShowArea.style.height 		= 480;
	oShowArea.style.position 	= 'absolute';
	oShowArea.style.overflow 	= 'auto';
      oShowArea.style.left 		= 100;
      oShowArea.style.top 		= 100;
	oShowArea.style.backgroundColor = 'EEEEEE';
      oShowArea.style.fontSize	= '16px';
	document.body.appendChild(oShowArea);
	oShowArea.innerHTML = '<div align="center" onclick="document.body.removeChild(this.parentNode);" style="font-size:16px;background-color:FFFF55;cursor:pointer">Закрыть</div>';
	oShowArea.innerHTML += print_r(mVar,iDebugLevel);
}



function testObject(){
	this.testVar1 = 1234546;
	this.testVar2 = 'test string';
	this.testVar3 = false;
	this.testVar4 = new Array(1,2,3,'aewagery');
}

var oTestObj = new testObject();



//debug_var(oTestObj,3)
debug_var(document,3)


//-->
</script>
</body>
<html>
 

netmac

Новичок
Чет у меня никаких ошибок сей скрипт не выдает.

И что за?
cursor<img src="images/smilies/tongue.gif" border="0" alt="">ointer
 

ONK

Пассивист PHPСluba
netmac, надо раскомментировать вторую строку.

<img src="images/smilies/tongue.gif" border="0" alt=""> это то, что вставил форум, сейчас попробую отредактировать.
 

phprus

Moderator
Команда форума
netmac
cursor<img src="images/smilies/tongue.gif" border="0" alt="">ointer
Это глюк форума. должно быть : p (без пробела, а то на смайлик заменит)
ONK
FF1.5.0.8 - полет нормальный. Все работает и вроде без ошибок.
 

ONK

Пассивист PHPСluba
Отключил парсировку смайлов.

phprus, FF2.0 не работает, в IE работает если глубину дебага выставить в 1. Как я выяснил, проблема в этом обращении к свойству объекта mVar[key]. Хотя суда по MSDN это полностью законная синтаксическая конструкция для объектов, но в реальности, если свойство является сложным внутренними объектом, происходит критическая ошибка. IE например вылетает на обращение к свойству filters.
 

phprus

Moderator
Команда форума
Я ошибся. Если раскомментировать debug_var(document,3), то в FF1.5.0.8 тоже ничего не работает. Может попробовать написать багрепорт на bugzilla.mozilla.org и посмотреть что они ответят?
 

ONK

Пассивист PHPСluba
phprus, хорошее предложение, очень интересно, как они это прокомментируют. Ещё бы и в microsoft.com написать, но сомневаюсь в продуктивности этой затеи.
 

zaman

Новичок
У меня ругается в этом блоке
for(key in mVar){
sOut += "<br>" + "[" + key + " ] = " + print_r(mVar[key],iDebugLevel);
}

Странная конструкция для цикла for, всегда было так - for(;;)
Параметр key - совсем пустой какой-то, как происходит его инициализация ?
 

ONK

Пассивист PHPСluba
zaman, это аналог сокращённого foreach только задом на перёд. При каждой итерации из объекта mVar берётся одно свойство и его название помещается в переменную key.
Все ошибки в браузерах возникают на операции доступа к свойству объекта (mVar[key]). Похоже разработчики просто не предпологали, что объект HTML документа можно так прошерстить. Я склоняюсь к тому, что это браузерные баги.
 

phprus

Moderator
Команда форума
ONK
Ну microsoft.com они если и ответят, то только через пару лет, а ошибку исправят только в IE17, а вот в багзиллу мозилловскую я думаю действительно можно написать и если это баг, то может хотябы в мозилле его исправят.
 

BRat

o_0
ONK
ребят, ну вы даёте :) Неужто никто своей функции dump() для php не писал?) А если писали, то помните $_GLOBALS["GLOBALS"]. Соответсвенно для IE - не помешает убрать documentElement, ownerDocument, parentNode и прочие прелести из числа перебираемых узлов. А для Mozilla - привожу тут текст ошибки и перевод:
Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOM3Document.domConfig]" nsresult: "0x80004001 (NS_ERROR_NOT_IMPLEMENTED)" location: "JS frame :: file:///Y:/html/print_r.html :: print_r :: line 15" data: no]
nsIDOM3Document.domConfig - не реализовано, т.е. при обращении к этому свойству и происходит вылет твоего скрипта, его тоже надо исключить из списка перебираемых.

Учимся читать..;)
 

ONK

Пассивист PHPСluba
BRat,
1. Следить за рекурсией нет необходимости, т.к. "глубина отладки" задаётся в качестве параметра процедуры.
2. Если что-то не реализовано, значит такого свойства у объекта не должно быть, а если оно по недосмотру есть, значит это проблемы разработчика.
 

BRat

o_0
ONK
1. ну можно и не следить, твоё право, просто несколько корявый print_r получится, и вниз и вверх по дереву
2. Я тебе предложил рабочий вариант, можешь конечно оставить как есть, и ждать пока исправят )
 

ONK

Пассивист PHPСluba
BRat,
1. накладывание заплаток на чужие баги это кривое решение, которое мне не нравится.
2. мне какраз нужно и вниз и вверх. -)
3. это не рабочий вариант, т.к. там рекурсий целый вагон, причём содержимое вагона существенно меняется от браузера к браузеру.
4. в Опере всё работает как часы, этого пока мне достаточно. Думаю, что в таком виде меня этот инструмент устраивает, не вижу смысла дальше тратить на него время.
5. никто тебе не мешает доделать так как нравится самому.
 

BRat

o_0
ONK
твоё право )
зачем мне твоё доделывать, своё имеется -)

ты хотел знать в чём проблема, я тебе сказал в чем.
 

ONK

Пассивист PHPСluba
С FF вроде всё понятно, обещают когданибудь доделать недоделанное.
https://bugzilla.mozilla.org/show_bug.cgi?id=226193

-~{}~ 29.11.06 05:35:

Нашлось простое решение, лежавшее на поверхности

Небольшая модификация скрипта и всё работает везде, где надо.
PHP:
                    try {
                        sOut += "<br>" + "[" + key + " ] = " + print_r(mVar[key],iDebugLevel);
                    }
                    catch (e) {
                        sOut += "<br>" + "[" + key + " ] = " + e;
                    }
 
Сверху