Полезная информация

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№126-11-2005 03:22:54

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Глюк в JavaScript.

Есть два скрипта, отличаются на одну строчку - вывод алерт-сообщения.

Задача скрипта - рекурсивно вывести все свойства объекта.

Скрипт первый, рабочий, но нет возможности дописать:

Выделить код

Код:

<script type="text/javascript">
function getProps(mas){
for(b in mas){
 for(a in eval(mas[b])){
  document.writeln(mas[b]+"."+a+" = \""+eval(mas[b])[a]+"\"<br>");
  if(eval(mas[b])[a]=="[object HTMLCollection]"){
   getProps(new Array(mas[b]+"."+a));
  }
 }
}
}
getProps(new Array("document"));
</script>

Скрипт второй, нерабочий с дополнительный выводом сообщения:

Выделить код

Код:

<script type="text/javascript">
function getProps(mas){
for(b in mas){
 for(a in eval(mas[b])){
  document.writeln(mas[b]+"."+a+" = \""+eval(mas[b])[a]+"\"<br>");
  alert(eval(mas[b])[a].substring(0,8));
  if(eval(mas[b])[a]=="[object HTMLCollection]"){
   getProps(new Array(mas[b]+"."+a));
  }
 }
}
}
getProps(new Array("document"));
</script>

Первый скрипт выводит энное количество информации, второй - пару строк. Не правда ли странно? Проблема возникает именно при таком выводе, вот думаю как бы решить такой глук... Вывод прекращается после вывода объекта - мб в этом загвоздка?

Собственно хотелось, бы чтобы такой глук не имел место быть, а раз уж он есть - пусть обозреватель (кстате да, ща проинсталлил последнюю версию - видел слово бразверь... русский язык умирает :( ) сообщает о причинах остановки работы скрипта.

Отредактировано Destruction (26-11-2005 03:23:58)

Отсутствует

 

№226-11-2005 03:33:00

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Re: Глюк в JavaScript.

Глук номер два - трабла в условии, вот слегка улушченный скрипт:

Выделить код

Код:

<script type="text/javascript">
function getProps(mas){
for(b in mas){
 for(a in eval(mas[b])){
  document.writeln(mas[b]+"."+a+" = \""+eval(mas[b])[a]+"\"<br>");
  if(eval(mas[b])[a]=="[object StyleSheetList]" || eval(mas[b])[a]=="[object HTMLCollection]" || eval(mas[b])[a]=="[object NodeList]"){
   getProps(new Array(mas[b]+"."+a));
  }
 }
}
}
getProps(new Array("document"));

Пытаюсь продолжить - делаю такой скрипт:

Выделить код

Код:

<script type="text/javascript">
function getProps(mas){
for(b in mas){
 for(a in eval(mas[b])){
  document.writeln(mas[b]+"."+a+" = \""+eval(mas[b])[a]+"\"<br>");
  if(eval(mas[b])[a]=="[object StyleSheetList]" || eval(mas[b])[a]=="[object HTMLCollection]" || eval(mas[b])[a]=="[object NodeList]" || eval(mas[b])[a]=="[object DocumentType]"){
   getProps(new Array(mas[b]+"."+a));
  }
 }
}
}
getProps(new Array("document"));
</script>

Опять же - вырубаемся раньше времени.. Если в первом случае я еще могу хоть как-то понять проблему, мб и неверно, но вот что тут - хоть повесся, ума не приложу.

PS: Очень надеюсь, что проблемы не остануться незамечеными и найдут ответы/решения/фиксы.

Отредактировано Destruction (26-11-2005 03:33:51)

Отсутствует

 

№326-11-2005 03:52:31

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Re: Глюк в JavaScript.

Ага, увидел кто автор js3250.dll, ну что? Мне терь идти ругаться на форум Netscape Communication?

Отсутствует

 

№426-11-2005 11:22:30

Lynn
Кофеман
 
Группа: Members
Откуда: Россия
Зарегистрирован: 16-02-2005
Сообщений: 1721
Веб-сайт

Re: Глюк в JavaScript.

А вам не кажется, что пробегаться рекурсивно по документу и при этом в него же писать несколько стрёмно? Попробуйте сначала всё собрать в переменную, а напечатать в самом конце.


Isn't it ironic... don't you think? — Alanis Morissette

Отсутствует

 

№526-11-2005 12:13:01

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Re: Глюк в JavaScript.

А вам не кажется, что пробегаться рекурсивно по документу и при этом в него же писать несколько стрёмно? Попробуйте сначала всё собрать в переменную, а напечатать в самом конце.

Стрёмно-то оно стрёмно, но в чем заключается стрёмность? - В том, что может зациклится, а тут наоборот.

Впринципе, можно сделать буферизацию вывода, хотя я и не вижу в этом смысла - вот при переборе IE'шного документа - там да, там document.all, там может зациклится.

А вообще, я идиот - с утра пораньше встал и понял :) "eval(mas[b])[a]" - пока строка, он делает нормальный вывод, когда объект - делает нормальный вывод, но когда я пытаюсь его резать - скрипт вырубается, ибо резать сабстрингом или матчем объекты не умеет, хорошо хоть IE подсказал.

Отсутствует

 

№626-11-2005 14:21:27

Lynn
Кофеман
 
Группа: Members
Откуда: Россия
Зарегистрирован: 16-02-2005
Сообщений: 1721
Веб-сайт

Re: Глюк в JavaScript.

А вообще, уж не это ли вы велосипед вы изобретаете?


Isn't it ironic... don't you think? — Alanis Morissette

Отсутствует

 

№726-11-2005 14:33:26

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Re: Глюк в JavaScript.

Не, я уже изобрел и покруче, конечно метод идиотский, но в результате - кроссбраузерность и выводится несколько больше объектов.

Ня вот, посмотришь:

Выделить код

Код:

<html>
<head><title>List of all functions</title></head>
<body></body>
</html>
<script type="text/javascript">
<!-- //
var res="";
function getProps(mas){
	var a,prop,val;
	if(mas.match(/^(document.scripts.\d+)|(document.body.all)|(document.childNodes.\d+)|(document.body.childNodes.\d+)|(document.all.\d+)|(document.firstChild)|(document.lastChild)|(document.body.firstChild)|(document.body.lastChild)|(document.documentElement)|(document.parentWindow)|(document.frames.top)|(document.frames.parent)|(document.frames.window)|(document.frames.frames)|(document.frames.self)|(document.body.document)|(document.body.parentElement)|(document.frames.document)|(document.body.currentStyle)|(document.body.runtimeStyle)|(document.body.style)|(document.body.children.\d+)|(document.body.parentNode)|(document.body.lastChild)|(document.body.ownerDocument)|(document.body.attributes..+.ownerDocument)|(document.body.attributes.(language)|(dataFld)|(onmouseup)|(oncontextmenu)|(onrowexit)|(onbeforepaste)|(onactivate)|(lang)|(onmousemove)|(onmove)|(onselectstart)|(oncontrolselect)|(onkeypress)|(oncut)|(onrowenter)|(onmousedown)|(onpaste)|(id)|(onreadystatechange)|(onbeforedeactivate)|(hideFocus)|(dir)|(onkeydown)|(onlosecapture)|(ondrag)|(ondragstart)|(oncellchange)|(onfilterchange)|(onrowsinserted)|(ondatasetcomplete)|(onmousewheel)|(ondragenter)|(onblur)|(onresizeend)|(onerrorupdate)|(onbeforecopy)|(ondblclick)|(onkeyup)|(onresizestart)|(onmouseover)|(onmouseleave)|(title)|(onresize)|(contentEditable)|(dataFormatAs)|(ondrop)|(onpage)|(onrowsdelete)|(onfocusout)|(onfocusout)|(ondatasetchanged)|(ondeactivate)|(onpropertychange)|(ondragover)|(onhelp)|(ondragend)|(onbeforeeditfocus)|(disabled)|(onfocus)|(accessKey)|(onscroll)|(onbeforeactivate)|(onbeforecut)|(onclick)|(oncopy)|(tabIndex)|(onbeforeupdate)|(ondataavailable)|(onmouseout)|(onmouseenter)|(onlayoutcomplete)|(implementation)|(onafterupdate)|(text)|(bottomMargin)|(noWrap)|(onbeforeunload)|(vLink)|(onafterprint)|(aLink)|(link)|(bgProperties)|(bgColor)|(onbeforeprint)|(leftMargin)|(background)|(topMargin)|(scroll)|(onload)|(rightMargin)|(onselect)|(onunload))|(document.body.children)|(document.body.previousSibling)|(document.createRange\(\).cloneRange\(\))$/)==null)
	for(a in eval(mas)){
		if(len>maxlen)
			return;
		len++;
		prop = mas+"."+a;
		if(len>maxlen)
			alert(prop);
		if(prop!="document.frames.clientInformation" && prop!="document.frames.external" && prop!="document.frames.navigator" && prop!="document.selection.typeDetail" && prop!="document.body.outerText" && prop!="document.body.innerText" && prop!="document.body.outerHTML" && prop!="document.body.innerHTML" && prop!="document.domConfig" && prop!="document.loadingState")
			val = String(eval(mas)[a]);
		else if(prop=="document.body.outerText" || prop=="document.body.innerText" || prop=="document.body.outerHTML" || prop=="document.body.innerHTML")
			val = "<i>Эту информацию рекомендуется не выводить</i>";
		else
			val = "<i>Нет доступа к переменной/Функции</i>";
		res += len+". "+prop+" = \""+val+"\"<br>";
		if(val.match(/function\(\)/)){
			getProps(prop+"()");
		}
		if((val=="[object]" || val=="[object HTMLCollection]") && !val.match(/(document.all)|(document.body.all)/))
			getProps(prop);
	}
}
var len=0,maxlen=10000;
getProps("document");
document.write(res);
// -->
</script>

Почему я воткнул script после HTML ? Чтобы сделать разборку обязательных тэгов - HTML, HEAD, TITLE, BODY.

В Опере например такой код разбирает еще несколько функций, в т.ч. document.createRange();

PS: Переменные len и maxlen я использовал для отладки - они ваще нах тут не нужны :)

Замечание за причину ненадобности переменных. Скрытый мат, п.3.1.
RED

Отредактировано Destruction (26-11-2005 14:36:56)

Отсутствует

 

№826-11-2005 14:50:24

Destruction
Участник
 
Группа: Members
Зарегистрирован: 26-11-2005
Сообщений: 6

Re: Глюк в JavaScript.

Хмм..

Глянул в HEX, js3250.dll - увидел слово XML, собсно всплывает вопрос, какие у JS есть функции для работы с XML?

Отсутствует

 

№926-11-2005 16:19:28

Unghost
Призрак-админ
 
Группа: Administrators
Откуда: Moscow, Russia
Зарегистрирован: 08-10-2004
Сообщений: 11771

Re: Глюк в JavaScript.

==> Разработка


Do not meddle in the affairs of Wizards, for they are subtle and quick to anger.

Отсутствует

 

№1027-11-2005 01:43:36

Rion
Участник
 
Группа: Extensions
Откуда: Екатеринбург
Зарегистрирован: 15-06-2005
Сообщений: 227

Re: Глюк в JavaScript.

Destruction пишет

Хмм..

Глянул в HEX, js3250.dll - увидел слово XML, собсно всплывает вопрос, какие у JS есть функции для работы с XML?

http://xulplanet.com/references/objref/#xml
http://developer.mozilla.org/en/docs/AJAX
http://developer.mozilla.org/en/docs/E4X

Отредактировано Rion (27-11-2005 01:46:32)


Gentoo Linux

Отсутствует

 

№1128-11-2005 12:17:17

Snik
Участник
 
Группа: Members
Зарегистрирован: 27-04-2005
Сообщений: 425
Веб-сайт

Re: Глюк в JavaScript.

Destruction
Для XML предназначен тот же document.createRange();
Вообще же все функции DOM 2 Core к нему тоже относятся.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]