Цитата:
Цитата:
Цитата:
p.s. считаю, вполне можно на ты ;-) |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>blank</title> <script type="text/javascript"> var TextNode = { each: function(callback, parent) { for (var childNodes = (parent || document.body).childNodes, i = 0, length = childNodes.length; i < length; i++) { var I = childNodes[i]; /*if (I) */I.nodeType == 1 ? arguments.callee(callback, I) : 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) { var n = noda.nextSibling, p = noda.parentNode; do p.insertBefore(div.firstChild, n); while (div.firstChild); p.removeChild(noda); } }); */ 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>'); var f = document.createDocumentFragment(); while( div.childNodes.length ) f.appendChild( div.childNodes[0] ); noda.parentNode.replaceChild( f, noda ); }); /*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) { var f = document.createDocumentFragment(); do f.appendChild(div.firstChild); while (div.firstChild); noda.parentNode.replaceChild(f, noda); } });*/ }; </script> </head> <body> <div class="authForm"> <form action="/Default.aspx" method="post" onsubmit="return $(this).validate();"> <input type="hidden" name="auth" value="auth" /> <br /> <div id="ctl00_Authorization1_messages"> <br /> </div> имя<br /> <input type="text" name="username" value="" maxlength="20" class="v-required v-name v-minlength2" /> <br /> пароль<br /> <input type="password" name="password" maxlength="40" class="v-required" /> <br /> <br /> <input type="submit" value=" Войти " /> <br /> <br /> </form> <a href="Registration.aspx">регистрация</a> <br /> <br /> </div> <table class="list"> <tr> <td> mmm </td> <td> dsfssssssss </td> <td> fdgfdgd f 111 http://www.youtube.com/watch?v=iuOcLoqo5e0 23423 rgfd </td> <td> 01.04.2009 1:32:11 </td> </tr> <tr> <td> sawewq </td> <td> django </td> <td> </td> <td> http://www.youtube.com/watch?v=iuOcLoqo5e0 </td> </tr> <tr> <td> asddddd </td> <td> django </td> <td> </td> <td> 30.03.2009 2:47:18 </td> </tr> </table> http://www.youtube.com/watch?v=iuOcLoqo5e0 </body> </html> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>blank</title> <script type="text/javascript"> var TextNode = { each: function(callback, parent) { for (var childNodes = (parent || document.body).childNodes, i = 0, length = childNodes.length; i < length; i++) { var I = childNodes[i]; /*if (I) */I.nodeType == 1 ? arguments.callee(callback, I) : 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>'); var f = document.createDocumentFragment(); //if (div.firstChild) { while (div.firstChild) f.appendChild(div.firstChild); noda.parentNode.replaceChild(f, noda); //} }); /*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) { var f = document.createDocumentFragment(); do f.appendChild(div.firstChild); while (div.firstChild); noda.parentNode.replaceChild(f, noda); } });*/ }; </script> </head> <body> <form> <input type="text" /> <input type="text" /> </form> </body> </html> При этом если форму записать в одну линию, то ошибка исчезает: <form><input type="text" /><input type="text" /></form> |
значит удаляются (исключаются) пустые текстовые ноды, а length считается в начале цикла
upd: а точнее, во всех браузерах, кроме IE получаем 1: var div = document.createElement('div'); div.innerHTML = ' '; alert(div.childNodes.length); |
var f = document.createDocumentFragment(); while (div.firstChild) f.appendChild(div.firstChild); noda.parentNode.replaceChild(f, noda); а так как div пустой то и div.firstChild-а нету, т. е. содержимое while не разу не сработает. И потом нода заменяется на пустой DocumentFragment. Так в .childNodes попадают undefined. Решение: 1) В TextNode.each добавляем if (I) (в последнем моем посте он закоментирован) И не только для этого случая. Мало ли в каких ситуациях такое может случиться. 2) Зачем перезаписывать текстовые узлы содержащие пробельные символы. Добавляем проверку: if (div.firstChild) { (она тож закоментирована) В результате пустых div-ов просто не будет. 3) Зачем вообще перезаписывать текстовые узлы содержание которых не изменилось. Добавляем к проверке еще условие if (div.firstChild && div.innerHTML != noda.nodeValue) { В посте №20 был пока лучший вариант. |
Цитата:
Цитата:
Цитата:
я бы написал так: 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 ); }); }; не знаю, если бы это была какая-то общедоступная библиотека, стоило бы ее как-то оптимизировать, но такого опыта у меня пока нету. И я бы скорее искал узкие места в реальных приложениях, чем оптимизировал все по максимуму кстати, по поводу читабельности можно вспомнить http://en.wikipedia.org/wiki/Unix_philosophy , там несколько раз отдается предпочтение читабельности, а не наоборот |
Цитата:
Цитата:
if (div.firstChild && div.innerHTML != noda.nodeValue) { и кода больше. |
Цитата:
Можно ее просто не запоминать: var TextNode = { each: function(callback, parent) { for (var childNodes = (parent || document.body).childNodes, i = 0; i < childNodes.length; i++) { var I = childNodes[i]; I.nodeType == 1 ? arguments.callee(callback, I) : I.nodeType == 3 && callback(I, i); } } }; |
Цитата:
Цитата:
|
Цитата:
Что касается window.onload, то это одноразовый код, минусы которого не будут перетекать с сайта на сайт. Так что, действительно, пусть себе тормозит сколько угодно. Цитата:
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 11:59. |