Показать сообщение отдельно
  #35 (permalink)  
Старый 09.04.2009, 03:55
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

давайте тогда свой текущий вариант приведу:
var TextNode = {
    each: function(callback, parent) {
        var childNodes = (parent || document.body).childNodes;
        length = childNodes.length;
        for (var i=0; i < length; i++) {
            var I = childNodes[i];
            if( I.nodeType == 1 )
                arguments.callee(callback, I);
            elseif( I.nodeType == 3 )
                callback(I, i);
        }
    }
};
 
window.onload = function() {
    TextNode.each(function(noda) {
        var div = document.createElement('div');
        div.innerHTML = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
        if (! div.firstChild ||
            (div.innerHTML == noda.nodeValue))
                return;
        var f = document.createDocumentFragment();
        while (div.firstChild)
            f.appendChild(div.firstChild);
        noda.parentNode.replaceChild(f, noda);
    });
};

вариант Riimа, Поиск выражения в тексте
не считаю, что все должны писать как я, мне скорее интересно, действительно ли оправдана такая экономия на каждом операторе, пусть даже и в библиотеках
div.firstChild: в ie div.innerHTML = ' '; ничего в div не добавляет, т.е. "пустые" текстовые ноды удаляются, при этом нужно в другом месте либо на каждой итерации проверять текущую длину (а не считать ее один раз), либо делать в итерации проверку, что теукщий узел существует, а именно здесь:
div.innerHTML != noda.nodeValue: чтобы не выполнять лишних действий, когда текущий узел останется таким же каким и был
Ответить с цитированием