Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 08.04.2009, 13:57
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
Не зарекайтесь
я периодически копаюсь в jQuery, проблем пока не было
Цитата:
И вы что то друг за друга отвечаете. Прям наехали тут на меня вдвоем
значит у нас просто совпадают мнения, зови своего одномышленника, похоливарим ;-)
Цитата:
В IE ваш вариант выдал ошибку, т. к. коллекция .childNodes почему то стала содержать undefined элементы
а можно содержимое body? А то на моих довольно простых данных не было проблем ни в ie6, ни в ie7. И неужели работа с childNodes напрямую (через n) решило эту проблему?
p.s. считаю, вполне можно на ты ;-)
Ответить с цитированием
  #22 (permalink)  
Старый 08.04.2009, 14:13
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

<!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>
Ответить с цитированием
  #23 (permalink)  
Старый 08.04.2009, 14:34
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

<!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>
Ответить с цитированием
  #24 (permalink)  
Старый 08.04.2009, 14:41
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

значит удаляются (исключаются) пустые текстовые ноды, а length считается в начале цикла
upd: а точнее, во всех браузерах, кроме IE получаем 1:
var div = document.createElement('div');
div.innerHTML = ' ';
alert(div.childNodes.length);

Последний раз редактировалось x-yuri, 08.04.2009 в 14:48.
Ответить с цитированием
  #25 (permalink)  
Старый 08.04.2009, 15:07
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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 был пока лучший вариант.
Ответить с цитированием
  #26 (permalink)  
Старый 08.04.2009, 15:51
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
Так в .childNodes попадают undefined
они туда не попадают, дело в уменьшении размера childNodes
Цитата:
И не только для этого случая.
Мало ли в каких ситуациях такое может случиться
с такими "как бы чего не вышло" можно далеко зайти, поэтому я предпочитаю знать, зачем я что-то делаю
Цитата:
Зачем перезаписывать текстовые узлы содержащие пробельные символы
это случайно получилось, я на это не рассчитывал
я бы написал так:
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 , там несколько раз отдается предпочтение читабельности, а не наоборот
Ответить с цитированием
  #27 (permalink)  
Старый 08.04.2009, 17:54
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
while( div.firstChild )
f.appendChild( div.firstChild );
Я уже писал, что в данном случае while нужно заменить на do-while, т. к. проверка div.firstChild происходит прямо перед циклом. Зачем делать ее 2 раза подряд.


Сообщение от x-yuri
if (! div.firstChild ||
(div.innerHTML == noda.nodeValue))
return;
медленней чем:
if (div.firstChild && div.innerHTML != noda.nodeValue) {


и кода больше.
Ответить с цитированием
  #28 (permalink)  
Старый 08.04.2009, 18:15
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
они туда не попадают, дело в уменьшении размера childNodes
Если точнее то да. Длинна уменьшается, а в цикле используется запомненная в переменной length длинна.
Можно ее просто не запоминать:
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);
		}
	}
};
Ответить с цитированием
  #29 (permalink)  
Старый 08.04.2009, 19:04
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Цитата:
Я уже писал, что в данном случае while нужно заменить на do-while, т. к. проверка div.firstChild происходит прямо перед циклом. Зачем делать ее 2 раза подряд
я видел, я тоже уже писал, что у меня не производительность на первом месте. А если бы я оптимизировал, то искал бы скорее узкие места, а не экономил на спичках. По-крайней мере, я не видел авторитетных источников, которые бы проповедовали такое делать, зато видел много противоположных, один привел выше, т.е. там на самом деле даже несколько человек высказались за оптимизацию узких мест. Для меня был бы аргументом реальный проект, использующий именно эту функцию, который тормозит из-за того, что do-while был заменен на while
Цитата:
медленней чем...и кода больше
зато нету лишнего уровня вложенности
Ответить с цитированием
  #30 (permalink)  
Старый 08.04.2009, 19:31
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
А если бы я оптимизировал, то искал бы скорее узкие места, а не экономил на спичках.
Универсальные функции обычно и становятся узкими местами. Не лучше ли подумать об этом сразу, чем возвращаться потом.
Что касается window.onload, то это одноразовый код, минусы которого не будут перетекать с сайта на сайт. Так что, действительно, пусть себе тормозит сколько угодно.

Сообщение от x-yuri
зато нету лишнего уровня вложенности
А чем плох лишний уровень вложенности? Ты же за читаемость.

Сообщение от x-yuri
который тормозит из-за того, что do-while был заменен на while
Из-за одного такого случая вряд ли что-то изменится. Но если весь код писать так, то меняется, и очень даже заметно.

Сообщение от x-yuri
Для меня был бы аргументом реальный проект
Я вот только что был на qip.ru. У меня почта там. Зайди и посмотри, как тормозит почтовый интерфейс напичканный ajax-ом. При нажатии на ссылку запускающую javascript аж флеш-банеры подвисают. А теперь зайди на gmail.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в строке другой подстроки средствами JS YAN Общие вопросы Javascript 13 23.07.2013 09:41
Поиск на странице no_name jQuery 4 07.09.2010 13:26
построение XPath выражения endryha Общие вопросы Javascript 5 11.03.2009 17:00
Для чего ограничен поиск? ZoNT Сайт Javascript.ru 4 01.10.2008 15:55
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31