Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #51 (permalink)  
Старый 09.04.2009, 11:14
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Zeroglif
Кто ж против применения
А я уж подумал, что вы против.

Сообщение от Zeroglif
В вашем конкретном случае равенство строк не гарантировано. Неужели так сложно проверить? Чего будет на странице до и чего после:

text
<p&gt
alone
Сообщение от Zeroglif
http://msdn.microsoft.com/en-us/library/ms533897.aspx
https://developer.mozilla.org/En/DOM/Element.innerHTML

Я еще раз проверил в разных браузерах. Я очень всматривался пытаясь увидеть разницу. И ее нет.
Вероятно вы используете старый вариант. Я же приводил исправленный вариант уже:
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 = function() {
	TextNode.each(function(noda) {
		var v = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
		if (v != noda.nodeValue) {
			var div = document.createElement('div');
			div.innerHTML = v;
			if (div.firstChild) {
				var f = document.createDocumentFragment();
				do f.appendChild(div.firstChild);
				while (div.firstChild);
				noda.parentNode.replaceChild(f, noda);
			}
		}
	});
};
Ответить с цитированием
  #52 (permalink)  
Старый 09.04.2009, 11:25
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Riim,

Сообщение от Riim
var div
var f
Можно один раз объявить, и записать свойством в функцию-коллбэк, иначе, они создаются каждый раз при вызове callback(I, i);.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #53 (permalink)  
Старый 09.04.2009, 11:47
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Zeroglif
Тем более жутко, что нет вообще никакой необходимости replace-ить все текстовые ноды без разбора (на кой ляд это делается?).
Если не хотите приводить свой код, то хоть объясните подробней, как вы предполагаете это сделать, а я уж сам сделаю.

Сообщение от Dmitry A. Soshnikov
Можно один раз объявить, и записать свойством в функцию-коллбэк, иначе, они создаются каждый раз при вызове callback(I, i);.
А стоит так мучиться для одноразового кода. Разве, что ради идеи:

window.onload = function() {
	var callback = function(noda) {
		var v = noda.nodeValue.replace(/(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi, '<a href="$1">$1</a>');
		if (v != noda.nodeValue) {
			var div = arguments.callee.div;
			div.innerHTML = v;
			if (div.firstChild) {
				var f = arguments.callee.fragment;
				do f.appendChild(div.firstChild);
				while (div.firstChild);
				noda.parentNode.replaceChild(f, noda);
			}
		}
	};
	callback.div = document.createElement('div');
	callback.fragment = document.createDocumentFragment();
	TextNode.each(callback);
};


Странно, что после строки "var f = arguments.callee.fragment;" не нужно отчищать этот самый фрагмент. Видимо после добавления в документ он сам очищается.
Ответить с цитированием
  #54 (permalink)  
Старый 09.04.2009, 11:59
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Riim, речь шла о сравнении innerHTML с nodeValue
<!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; i < childNodes.length; i++) {
            var I = childNodes[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 f = document.createDocumentFragment();
            do f.appendChild(div.firstChild);
            while (div.firstChild);
            noda.parentNode.replaceChild(f, noda);
        }
    });
};
    </script>
</head>
<body>
 
text 
&lt;p&gt
alone
 
</body>
</html>

Цитата:
А стоит так мучиться для одноразового кода. Разве, что ради идеи
так ты определись, что мы обсуждаем. А то сначала ты говоришь про экономию операторов, а потом, что это одно разовый код. Давай тогда представим, что это супер-мега-быстрый фреймворк. Это твой окончательный вариант?
p.s. кто-нибудь может что-то сказать про экономию операторов, кроме Riim, он уже вроде высказался по этому поводу
Ответить с цитированием
  #55 (permalink)  
Старый 09.04.2009, 11:59
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Riim
А стоит так мучиться
Ну вы ж тут, вроде, об оптимизации беседуете (хотя, весь топик я не читал)? Поэтому, лучше один раз "помучиться", чем на каждый вызов.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #56 (permalink)  
Старый 09.04.2009, 12:19
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от Riim
то хоть объясните подробней
У вас есть признак ноды, которая нужна (некий текст), проверяйте наличие этого текста и меняйте при наличии.

Сообщение от x-yuri
про экономию операторов
Вары через запятую - это нормально, много варов внутри 'for' - необычно, глаз не радует, строку удлиняет, обычно задают не больше двух. Объявление переменной внутри цикла - бессмысленная вешь, провоцирующая ньюбов на лишние вопросы. Условный оператор обязан быть читабелен среди профи (в меру простой, конечно), ничего не имею против, но чаще всего не читабелен для других. Кроме того, с ним не очень приятно дорабатывать код, расширяя список выражений. С логическими операторами картина та же, в отсутствии присваивания они теряют в читабельности, к тому же есть пуристы, которые используют их только в логическом контексте. Конструкция 'do-while' в примере может и была бы правильным выбором, если бы так нужно было проверять 'div.firstChild', а это не нужно, как и 'innerHTML' и проч.
Ответить с цитированием
  #57 (permalink)  
Старый 09.04.2009, 12:59
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Zeroglif, а с производительностью это как-то связано? Или вопрос стиля?
Ответить с цитированием
  #58 (permalink)  
Старый 09.04.2009, 13:07
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от x-yuri
Zeroglif, а с производительностью это как-то связано?
Это больше вопрос стиля, читабельности, удобства, краткости записи. О скорости можно рассуждать только с тестами в руках. Я не вижу иных причин отказываться от той же 'if-else' кроме как из-за экономии букв...
Ответить с цитированием
  #59 (permalink)  
Старый 09.04.2009, 13:23
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от x-yuri
Riim, речь шла о сравнении innerHTML с nodeValue
Я уже давно понял и написал исправленный вариант. Посты № 47 и 51.

Сообщение от Zeroglif
У вас есть признак ноды, которая нужна (некий текст), проверяйте наличие этого текста и меняйте при наличии.
Я так и думал, что вы про это. Если проверять БЕЗ regexp-а, то почему бы и нет.

Сообщение от x-yuri
А стоит так мучиться для одноразового кода. Разве, что ради идеи
так ты определись, что мы обсуждаем. А то сначала ты говоришь про экономию операторов, а потом, что это одно разовый код
Экономил операторы я в TextNode.each, а это уже НЕ одноразовый код.
Я давно определился и уже объяснял как именно.
Я говорю про:
1) производительность
2) объем кода
3) логичность кода
4) читабельность
Приоритеты меняются в зависимости от кода.
В TextNode.each на первом месте производительность (универсальный код).
В window.onload объем кода (одноразовый код).
Читабельность всегда на последнем.

Почему именно такой порядок, я уже объяснял (с примерами) выше. Например, объяснял, как из-за не оптимизированного универсального кода появляются проблемы с производительностью, т. к. рано или поздно, он все равно становится узким местом в приложении.

Оптимизация одного часто делается в ущерб остальному. Вопрос в том, насколько эффективна эта оптимизация, и каков ущерб.
Дмитрий предложил вариант оптимизации производительности в ущерб объему кода. Ущерб слишком большой, а выигрыш в скорости мизерный (теоретически, не тестировал). Вариант предложенный Zeroglif (с проверкой до regexp-а), даст заметно большее увеличение производительности и меньший ущерб. Вполне приемлемый вариант.

Во всех случаях выше, где я отходил от своих приоритетов, я пояснял, почему это делаю.
В случае с предложенным Дмитрием вариантом, я пояснил, что делаю это просто что бы попробовать идею.
Надеюсь, что на этот раз я все достаточно подробно изложил, и вопросов на счет моих приоритетов больше не будет.

Сообщение от Zeroglif
много варов внутри 'for' - необычно, глаз не радует, строку удлиняет, обычно задают не больше двух. Объявление переменной внутри цикла - бессмысленная вешь, провоцирующая ньюбов на лишние вопросы. Условный оператор обязан быть читабелен среди профи (в меру простой, конечно), ничего не имею против, но чаще всего не читабелен для других. Кроме того, с ним не очень приятно дорабатывать код, расширяя список выражений. С логическими операторами картина та же, в отсутствии присваивания они теряют в читабельности, к тому же есть пуристы, которые используют их только в логическом контексте
Я не хочу (без обид) вообще ни чего слышать про читабельность (в универсальном коде) в ущерб даже плюс одному байту кода после компрессора или плюс одному лишнему действию интерпретатора. Мой стиль не формируется, он уже сформирован, и до javascript2.0 я менять себя не собираюсь.


Сообщение от Zeroglif
Конструкция 'do-while' в примере может и была бы правильным выбором, если бы так нужно было проверять 'div.firstChild', а это не нужно
Как не нужно? Как же цикл тогда остановится?
Ответить с цитированием
  #60 (permalink)  
Старый 09.04.2009, 13:38
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от Riim
Как не нужно? Как же цикл тогда остановится?
Вы используете 'if' плюс 'do-while', если уйти от 'if', который не нужен вообще, то достаточно 'while'. Остановка цикла не при чём.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в строке другой подстроки средствами 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