10.04.2009, 16:28
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
Парни , спасибо за такое живое обсуждение моего вопроса. Прочитал всё , многое не понял
|
(это я не с тебя, а так, с ситуации)
Цитата:
|
Так всё-таки можно привести хотя бы 2 варианта кода
|
ну там вообще много было вариантов, только вопросы к тебе есть:
1) нужно не только найти ссылки, но и превратить их собственно в ссылки?
2) там где ты будешь ссылки искать - это просто блок текста или текст с разметкой, тэгами?
3) могут встречаться другие ссылки? Или только нужные?
Цитата:
|
Так же видел в коде windows.onload , моих знаний не так много и наверно я чето не понимаю , но с этим бывают проблемы
|
могут быть, если у тебя несколько скриптов будут изменять window.onload - только последний будет работать
Цитата:
|
P.S. Так же хотел спросить насколько просто/сложно , будет изменить код ,если потребуется искать не только по YouTube , но и по Google video и по другим видео....
|
можно, надо будет регулярное выражение доработать
|
|
10.04.2009, 16:44
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от grusha
|
Меня меньше интересует размер файла , больше интересует его производительность .
|
Ну тогда так вот:
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() {
var callback = function(noda) {
if (noda.nodeValue.indexOf('youtube.com') > -1) {
var v = noda.nodeValue.replace(arguments.callee.regExp, '<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.regExp = /(http\:\/\/www\.youtube\.com\/watch\?v\=[0-9a-z]{11})/gi;
callback.div = document.createElement('div');
callback.fragment = document.createDocumentFragment();
TextNode.each(callback);
};
Уйти от do-while без появления лишних операций не получается у меня.
Сообщение от grusha
|
И если возможно ,то код который бы работал с библиотекой jQuery .
|
Зачем тут Jquery?
Разве, что вместо window.onload использовать $.ready .
Сообщение от grusha
|
Так же видел в коде windows.onload , моих знаний не так много и наверно я чето не понимаю , но с этим бывают проблемы.
|
Как и сказал x-yuri проблемы будут когда ты захочешь повесить на windows.onload несколько обработчиков.
$.ready в Jquery для того и сделан.
|
|
10.04.2009, 16:46
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
И TextNode.each для любителей if-else:
var TextNode = {
each: function(callback, parent) {
for (var childNodes = (parent || document.body).childNodes, i = 0; i < childNodes.length; i++) {
var I = childNodes[i];
if (I.nodeType == 1) arguments.callee(callback, I);
else if (I.nodeType == 3) callback(I, i);
}
}
};
|
|
10.04.2009, 17:07
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
Уйти от do-while без появления лишних операций не получается у меня
|
так ведь если v != noda.nodeValue, то div.firstChild == true автоматически, т.е. ты это условие можешь просто убрать и заменить do-while -> while
Цитата:
|
И TextNode.each для любителей if-else
|
я бы все равно не так написал
|
|
10.04.2009, 17:27
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
так ведь если v != noda.nodeValue, то div.firstChild == true автоматически, т.е. ты это условие можешь просто убрать и заменить do-while -> while
|
А "var f = arguments.callee.fragment;" внутри while писать? Нет. А значит в некоторых случаях эта (и не только) строка сработает зря.
Сообщение от x-yuri
|
я бы все равно не так написал
|
grusha попросил несколько вариантов. Предлагай свой.
|
|
10.04.2009, 18:02
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
А "var f = arguments.callee.fragment;" внутри while писать? Нет. А значит в некоторых случаях эта (и не только) строка сработает зря.
|
я имел в виду так:
var callback = function(noda) {
if (noda.nodeValue.indexOf('youtube.com') > -1) {
var v = noda.nodeValue.replace(arguments.callee.regExp, '<a href="$1">$1</a>');
if (v != noda.nodeValue) {
var div = arguments.callee.div;
div.innerHTML = v;
var f = arguments.callee.fragment;
while (div.firstChild)
f.appendChild(div.firstChild);
noda.parentNode.replaceChild(f, noda);
}
}
};
если я не вижу ситуаций, когда (v != noda.nodeValue) && (! div.firstChild), скажи
|
|
10.04.2009, 18:12
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
если я не вижу ситуаций, когда (v != noda.nodeValue) && (! div.firstChild), скажи
|
Когда в innerHTML записываются табы форматирования. Ты же сам указывал на эту ситуацию. Пост №24.
|
|
10.04.2009, 18:16
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Цитата:
|
Когда в innerHTML записываются табы форматирования. Ты же сам указывал на эту ситуацию. Пост №24
|
так ведь v != noda.nodeValue, т.е. в текстовом узле была ссылка, значит во-первых текстовый узел не пустой, а во-вторых там вообще ссылка (тэг) уже есть (после replace)
а та проблема возникла из-за пустых (почти) текстовых узлов
|
|
10.04.2009, 18:23
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от x-yuri
|
так у ведь v != noda.nodeValue, т.е. в текстовом узле была ссылка
|
И правда. Башка ночью совсем не варит.
Значит TextNode.each из постов 82 и 83, и callback из поста 86 считаем окончательными вариантами?
|
|
10.04.2009, 18:52
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Только
var div = arguments.callee.div;
div.innerHTML = v;
var f = arguments.callee.fragment;
заменить на:
var div = arguments.callee.div,
f = arguments.callee.fragment;
div.innerHTML = v;
|
|
|
|