Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор html методами DOM 
:(
    Опции темы
JaOlga
Дата 5.3.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Помогите пожалуйста разобраться с проблемой!
Необходимо загрузить html-документ и с помощью DOM-методов нарисовать соответствующее ему дерево. 
Я загружаю документ :
Код

                        var pendingDoc = document.implementation.createDocument("", "", null);            
            pendingDoc.load("content/tags_example.html");                        
            
            var rootElement = pendingDoc.getElementById("testPage");
            var attributeID = rootElement.getAttribute("id");
            

но получаю исключение "rootElement has no properties"
rootElement = null
В чем моя ошибка? Я новичок в javascript. 
Спасибо!

PM MAIL   Вверх
SelenIT
Дата 5.3.2008, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(JaOlga @  5.3.2008,  14:03 Найти цитируемый пост)
В чем моя ошибка?

Имхо, в том, что к моменту вызова pendingDoc.getElementById XML разбираемый документ не успевает еще загрузиться. JS ведь не дожидается окончания load, а идет дальше.

Строки 4-5 нужно поместить в функцию, которая будет вызваться по pendingDoc.onload. Как здесь.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Sardar
Дата 5.3.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Добавь pendingDoc.async = false перед .load, заблокируешься до загрузки (хотя это не красиво).
Также убедись, что подгружаемый документ - это валидный XML (валидный HTML4 - не валидный XML)


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 5.3.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Sardar, у меня документ именно html. Его ведь можно анализировать методами DOM?

Добавлено через 14 минут и 46 секунд
Цитата(SelenIT @  5.3.2008,  14:18 Найти цитируемый пост)
Строки 4-5 нужно поместить в функцию, которая будет вызваться по pendingDoc.onload. Как здесь. 

Теперь генерируется исключение
pendingDoc has no properties ((

PM MAIL   Вверх
Sardar
Дата 5.3.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(JaOlga @  5.3.2008,  17:38 Найти цитируемый пост)
Его ведь можно анализировать методами DOM?

Да, если загрузить в ифрейм. XML парсером по идее нет, по крайней мере без особо хитрых, платформо-зависимых настроек. Он просто вывалиться оставив в .documentElement == null.

Цитата(JaOlga @  5.3.2008,  17:38 Найти цитируемый пост)
pendingDoc has no properties ((

Этого не может быть. Дай полный листинг (и привыкни давать сбойный код, читать мысли сложно).


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 6.3.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Цитата(Sardar @  5.3.2008,  23:42 Найти цитируемый пост)
Дай полный листинг

Пробую разобрать xml-документ:

Код

function Inspector()
{    
}
Inspector.prototype =
{
    pendingURL : null,
    
    viewTree: function()
    {
        if(document.implementation && document.implementation.createDocument)
        {
            this.pendingDoc = document.implementation.createDocument("", "", null);                        
            this.pendingDoc.onload = createNode;                        
        }        
        this.pendingDoc.load("content/test.xml");
        
    },
    
    createNode: function()
    {
        alert("createNode");
        try        
        {            
            var rootElement = this.pendingDoc.getElementById("test");
            var attributeID = rootElement.getAttribute("id");
            alert(attributeID);
        }
        catch(e)
        {
            alert(e.message);
        }            
    }
    
};

И генерится то самое исключение 
this.pendingDoc has no properties

А вот мой xml-файл
Код

<?xml version="1.0" encoding="UTF-8"?>
<block id="test">
    <subblock id="sub">Info
    </subblock>
</block>

PM MAIL   Вверх
Sardar
Дата 6.3.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(JaOlga @  6.3.2008,  10:10 Найти цитируемый пост)
И генерится то самое исключение 

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

В 24 строке верно?
this.pendingDoc.onload = createNode;  замени на this.pendingDoc.onload = function() { this.createNode.apply(this, arguments); }.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 6.3.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Цитата(Sardar @  5.3.2008,  23:42 Найти цитируемый пост)
Да, если загрузить в ифрейм. XML парсером по идее нет, по крайней мере без особо хитрых, платформо-зависимых настроек. Он просто вывалиться оставив в .documentElement == null.

А можно подробнее ? Или ссылочку на пример... Все-таки мне надо разобрать именно html smile 
PM MAIL   Вверх
Sardar
Дата 6.3.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Просто создай ифрейм (document.createElement("iframe") либо добавь в вёрстку скрытый заранее), загрузи в него документ (.src = url), возьми iframe.contentWindow.document или iframe.document - это DOM 1 документ.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 11.3.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Я должно быть достала своими вопросами, но хоть убейте не понимаю почему так происходит smile 
Тело html-документа выглядит следующим образом:
Код

     <body>
        <p id="p1">Test page</p>
        <br>
        <form>
            <ul>
                <li>first</li>
            </ul>
        </form>
    </body>

Пытаюсь получить все дочерние узлы body:
Код

var body = doc.body;             //получаю узел body           
if (body.hasChildNodes())       //проверяю на предмет наличия дочерних узлов но почему-то получаю false
{
       var p = body.firstChild;
       alert(p.nodeName);
}

Причем разбор раздела head идет как по маслу!!
PM MAIL   Вверх
JaOlga
Дата 11.3.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Да, кстати. Если хтмл-документ содержит помимо стандартных тегов еще и теги, определенные пользователем, как его тогда разбирать?
Наверное, предется писать собственный парсер, да? Дом-методы придется видимо оставить.
PM MAIL   Вверх
Sardar
Дата 11.3.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(JaOlga @  11.3.2008,  11:09 Найти цитируемый пост)
//проверяю на предмет наличия дочерних узлов но почему-то получаю false

Документ ещё не загрузился (после .src = url нужно немного подождать, лучше ловить .onload), либо ссылка на документ не правильная и документ никогда не загрузиться. Проверь что в body.innerHTML лежит.

Цитата(JaOlga @  11.3.2008,  11:29 Найти цитируемый пост)
Если хтмл-документ содержит помимо стандартных тегов еще и теги, определенные пользователем, как его тогда разбирать?
Наверное, предется писать собственный парсер, да? Дом-методы придется видимо оставить. 

DOM не зависит от содержания, это механизм доступа к узлам любого XML (подобного) документа. Свой парсер не нужен.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 11.3.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Цитата(Sardar @  11.3.2008,  13:09 Найти цитируемый пост)
либо ссылка на документ не правильная и документ никогда не загрузиться

Неправильная быть не может, если голова опозналась ??

Цитата(Sardar @  11.3.2008,  13:09 Найти цитируемый пост)
DOM не зависит от содержания, это механизм доступа к узлам любого XML (подобного) документа.

А в DOM Inspector Mozilla тоже дерево строится путем анализа DOM-методами исходного документа? Он все подряд анализирует.
PM MAIL   Вверх
Sardar
Дата 11.3.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(JaOlga @  11.3.2008,  12:40 Найти цитируемый пост)
Неправильная быть не может, если голова опозналась ??

document.body создаётся всегда, даже если документ не был загружен. Лиса создаёт ещё и заголовок с пустым title. Что бы не мусолить это дальше, просто напиши alert(document.documentElement.innerHTML); - этой техникой лучше пользоваться всегда в подобной ситуации, лучше чем просто гадать.

Цитата(JaOlga @  11.3.2008,  12:40 Найти цитируемый пост)
А в DOM Inspector Mozilla тоже дерево строится путем анализа DOM-методами исходного документа? 

Конечно. DOM это механизм доступа к любому узлу. Там нет "дай мне ссылку", там есть "дай мне элемент под имеем ...", где "..." может быть что угодно, включая элементы определённые тобой. Другое дело что документ будет не валидным (но well-formed) согласно DTD. Что бы точно можно было грузить любой контент в любом браузере - используй XML.

Можно ли достать тег "sardar"? Пробуем:
Код

    <sardar id="test" attr = "my attr">Some content</sardar>

<script type='text/javascript'>
    var sars = document.body.getElementsByTagName('sardar');
    if(sars.length > 0) {
        var sar = sars[0];
        alert('DOM supported: '+sar);
        alert('InnerHTML: ' + sar.innerHMTL); //это не часть DOM, поэтому null
        if(sar.firstChild) alert('DOM node value: ' + sar.firstChild.nodeValue);
        else alert('sardar has no children, parser is not conforming to XML specs!');
        alert('Attribute attr: ' + sar.getAttribute('attr'));
        if(typeof(HTMLElement) != 'undefined')
           alert('sardar insanceof HTMLElement: ' + (sar instanceof HTMLElement));
        else alert('sardar is not recognized as HTMLElement');
    } else alert("can't access sardar using DOM navigation");

    var sar = document.getElementById("test");
    if(sar != null) alert("DOM id fetch supported: "+ sar);
    else alert("Can't fetch sardar using id");

    //у меня только IE тест не проходит
</script>




--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
JaOlga
Дата 13.3.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.3.2008

Репутация: нет
Всего: нет



Спасибо за помощь !
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.