Заметки о вёрстке сайтов  ·  Александр Шуркаев об HTML, CSS и JavaScript (скрипты, справочники и примеры по сайтостроению)

Кроссбраузерное получение текста DOM-узла в XML-документе

12 апреля 2007 г.

Метод получения текста из XML DOM-узла работает в IE, FF, Opera и Safari.

Имеем XML-узел:

<title>ВЗГЛЯД / <hlword priority="strict">Путин</hlword> слетал к кубанским студентам</title>

На выходе надо получить строку ВЗГЛЯД / Путин слетал к кубанским студентам, без тегов, комментариев и т. д. Как это правильно сделать?

Когда-то давно я узнал функцию выдирания всего текста из DOM-узла (не важно, HTML это или XML). Но она работает медленнее, чем браузерные DOM-свойства text и textContent.

При этом в XML DOM-свойство text — для Internet Explorer и Opera; textContent — для Firefox и Opera. А вот для Safari ничего нет, он не понимает ни text, ни textContent.

Объединив все возможные подходы, получаем кроссбраузерную функцию:

function getElemText(node){
    return node.text || node.textContent || (function(node){
        var _result = "";
        if (node == null) {
            return _result;
        }
        var childrens = node.childNodes;
        var i = 0;
        while (i < childrens.length) {
            var child = childrens.item(i);
            switch (child.nodeType) {
                case 1: // ELEMENT_NODE
                case 5: // ENTITY_REFERENCE_NODE
                    _result += arguments.callee(child);
                    break;
                case 3: // TEXT_NODE
                case 2: // ATTRIBUTE_NODE
                case 4: // CDATA_SECTION_NODE
                    _result += child.nodeValue;
                    break;
                case 6: // ENTITY_NODE
                case 7: // PROCESSING_INSTRUCTION_NODE
                case 8: // COMMENT_NODE
                case 9: // DOCUMENT_NODE
                case 10: // DOCUMENT_TYPE_NODE
                case 11: // DOCUMENT_FRAGMENT_NODE
                case 12: // NOTATION_NODE
                // skip
                break;
            }
            i++;
        }
        return _result;
    }(node));
}

Мне тут особо по душе рекурсивная анонимная функция. Красота ;-)

Хитовые статьи про разработку сайтов

Рассылка новостей и новых статей

Сообщения будут приходить пару раз в неделю, не чаще

Объявления

LiveInternet