Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Поиск выражения в тексте (https://javascript.ru/forum/jquery/3317-poisk-vyrazheniya-v-tekste.html)

Riim 09.04.2009 08:54

Цитата:

Сообщение от x-yuri
авторитеность jQuery сомнительна - Сторонние библиотеки - быть или не быть?

Там обсуждается не авторитетность Jquery, а его (и не только его) необходимость. Хочешь похоливарить на эту тему?
Тогда без меня.

x-yuri 09.04.2009 09:06

Цитата:

Там обсуждается не авторитетность Jquery, а его (и не только его) необходимость. Хочешь похоливарить на эту тему?
Тогда без меня
"jQuery - либа, которая почти 3 года определяла браузер по UA-строчке, это супер-мега-кросс-браузерно..."
"Ну, да... косяков полно до сих пор..."
http://groups.google.ru/group/comp.l...cb11852d7ca75c
p.s. не собирался я холиварить, просто сказал, что ее авторитетность сомнительна

Riim 09.04.2009 09:15

И сомнительно то, что плагины на ней работают заметно быстрей чем на PrototypeJs?

Zeroglif 09.04.2009 09:27

Цитата:

Сообщение от Riim
Читайте внимательней.

Я читаю предельно внимательно. Вы понимаете, что такое innerHTML? ;)

Zeroglif 09.04.2009 09:30

Цитата:

Сообщение от Riim
Можно и без этого обойтись.

Есть оптимизация, а есть ошибки логики.

Riim 09.04.2009 09:38

Цитата:

Сообщение от Zeroglif
Я читаю предельно внимательно. Вы понимаете, что такое innerHTML?

innerHTML в отличии от nodeValue, innerText и createTextNode не экранирует теги и в данном случае это важно.

Цитата:

Сообщение от Zeroglif
Есть оптимизация, а есть ошибки логики.

Очень хочется увидеть ваш вариант без ошибок.

Riim 09.04.2009 09:43

Вероятно, вы хотите видеть это:

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);
			}
		}
	});
};

Zeroglif 09.04.2009 09:51

Свойство 'innerHTML' стандартизировано? Нет. Согласно спекам MS (как пример) это свойство "sets or retrieves the HTML between the start and end tags of the object", никаких точных деталей о представлении. Сначала вы приводите НЕИЗВЕСТНУЮ строку в контент, браузер по своим законам парсит её, форматирует и т.д., затем делаете обратное действие, которое точно также зависит от представления браузера(ом). Почему вы решили, что в этом случае можно гарантировать равенство неизвестных вам заранее строк (innerHTML==nodeValue/data)? Ради интереса попробуйте добавить в текст что-нибудь вроде &lt;p&gt... ;)

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

Riim 09.04.2009 10:36

Цитата:

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

Так я увижу ваш вариант или нет? Может и правда есть какой-то более простой способ.

Цитата:

Сообщение от Zeroglif
Свойство 'innerHTML' стандартизировано? Нет. Согласно спекам MS (как пример) это свойство "sets or retrieves the HTML between the start and end tags of the object", никаких точных деталей о представлении. Сначала вы приводите НЕИЗВЕСТНУЮ строку в контент, браузер по своим законам парсит её, форматирует и т.д., затем делаете обратное действие, которое точно также зависит от представления браузера(ом). Почему вы решили, что в этом случае можно гарантировать равенство неизвестных вам заранее строк (innerHTML==nodeValue/data)?

И во всю применяется во всех известных фреймворках:
prototype-1.6.0.3, uncompressed версия, стр. 411, метод String.prototype.unescapeHTML
Подобная ситуация решена тем же способом.

Думаете, разработчик PrototypeJs плохо ее протестировал?
Тогда яркий пример: стр. 1022, метод get класса Hash. Чувак до сих пор беспокоится о возможности отсутствия метода hasOwnProperty, хотя все адекватные яваскриптеры уже забыли давно об этом. Неужели вы думаете, что при этом он вдруг внезапно забыл качественно протестировать innerHTML. К тому же метод String.prototype.unescapeHTML уже не раз менялся, и каждый раз причиной указывалась кроссбраузерность.

Вы думаете, что разработчики, какого ни будь браузера, вдруг реализуют его (innerHTML) работу по-своему? Ну, если только они задумают его (браузер) утопить.

Беспокоитесь о кустарном браузере, изобретенном студентом Васей? Не забудьте еще о IE5.5, netscape, и Петя еще что-то изобретает.

Цитата:

Сообщение от Zeroglif
Свойство 'innerHTML' стандартизировано? Нет.

Впервые слышу. Если бы это было так, то об этом трубили бы на каждом углу.
w3c много, что перенял из стандарта ms.
Я тоже обеими руками за соблюдение стандартов, но в данном случае, даже если это так, то я сделаю исключение.

Цитата:

Сообщение от Zeroglif
Ради интереса попробуйте добавить в текст что-нибудь вроде &lt;p&gt...

Попробовал. Все норм.

Zeroglif 09.04.2009 10:46

Цитата:

Сообщение от Riim
И во всю применяется во всех известных фреймворках

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

text 
&lt;p&gt
alone


Цитата:

Сообщение от Riim
Впервые слышу. Если бы это было так, то об этом трубили бы на каждом углу.

http://msdn.microsoft.com/en-us/library/ms533897.aspx
https://developer.mozilla.org/En/DOM/Element.innerHTML

Цитата:

Сообщение от Riim
Попробовал. Все норм.

Ну, прям, норм. Ага.


Часовой пояс GMT +3, время: 20:52.