>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Глюк в JavaScript. http://forum.mozilla-russia.org/viewtopic.php?id=6450 |
Destruction > 26-11-2005 03:22:54 |
Есть два скрипта, отличаются на одну строчку - вывод алерт-сообщения. Задача скрипта - рекурсивно вывести все свойства объекта. Скрипт первый, рабочий, но нет возможности дописать: Выделить код Код:<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:33:00 |
Глук номер два - трабла в условии, вот слегка улушченный скрипт: Выделить код Код:<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:52:31 |
Ага, увидел кто автор js3250.dll, ну что? Мне терь идти ругаться на форум Netscape Communication? |
Lynn > 26-11-2005 11:22:30 |
А вам не кажется, что пробегаться рекурсивно по документу и при этом в него же писать несколько стрёмно? Попробуйте сначала всё собрать в переменную, а напечатать в самом конце. |
Destruction > 26-11-2005 12:13:01 |
Стрёмно-то оно стрёмно, но в чем заключается стрёмность? - В том, что может зациклится, а тут наоборот. Впринципе, можно сделать буферизацию вывода, хотя я и не вижу в этом смысла - вот при переборе IE'шного документа - там да, там document.all, там может зациклится. А вообще, я идиот - с утра пораньше встал и понял "eval(mas[b])[a]" - пока строка, он делает нормальный вывод, когда объект - делает нормальный вывод, но когда я пытаюсь его резать - скрипт вырубается, ибо резать сабстрингом или матчем объекты не умеет, хорошо хоть IE подсказал. |
Lynn > 26-11-2005 14:21:27 |
А вообще, уж не это ли вы велосипед вы изобретаете? |
Destruction > 26-11-2005 14:33:26 |
Не, я уже изобрел и покруче, конечно метод идиотский, но в результате - кроссбраузерность и выводится несколько больше объектов. Ня вот, посмотришь: Выделить код Код:<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. |
Destruction > 26-11-2005 14:50:24 |
Хмм.. Глянул в HEX, js3250.dll - увидел слово XML, собсно всплывает вопрос, какие у JS есть функции для работы с XML? |
Unghost > 26-11-2005 16:19:28 |
==> Разработка |
Rion > 27-11-2005 01:43:36 |
Destruction пишет
http://xulplanet.com/references/objref/#xml |
Snik > 28-11-2005 12:17:17 |
Destruction |