Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   replaceWith внутри each цикла не работает с моим тегом (https://javascript.ru/forum/jquery/50330-replacewith-vnutri-each-cikla-ne-rabotaet-s-moim-tegom.html)

ruzik 22.09.2014 07:50

replaceWith внутри each цикла не работает с моим тегом
 
Здравствуйте, у меня есть функция, которая принимает текст с моим собственным тегом <link title="title" src="src"> и конвертирует его в <a href="src">title</a>:
//<link src="" title=""> -> <a href="">title</a>
function ProceedLinkTag(text) {
var items = text.filter("link");

items.each(function () {
    var currentElement = $(this);
    var title = currentElement.attr("title");
    var source = currentElement.attr("src");

    var newElement = $("<a>" + title +"</a>");
    newElement.attr("href", source);

    $(this).replaceWith(newElement); //it don't work
    alert($(this)[0].tagName); //LINK
});

Вроде никаких ошибок не выдает, прохожусь отладчиком - вроде и тег мой определяет(не смотря на отсутствие закрывающего тега) и атрибуты, но заменять не хочет.
Использую примерно так:
alert(ProceedLinkTag($("<link src='http://lenta.ru/' title='title'>")));

Заранее спасибо!

krasovsky 22.09.2014 13:43

Для начала вставь полученные элементы куда нибудь (только не говори что ты пытаешься заменить все линки в хеде на ссылки) - и увидишь ссылки.
А то что ты проверяешь стала ли Link ссылкой - дык, это javascript а не алхимия. Линк линком и остался, кроме того ты создал новый элемент - ссылку и просто заменил одно другим. Так с чего бы $(this)[0].tagName вдруг должен стать равен A ?

ruzik 22.09.2014 17:37

Но объясните мне, я не понимаю.
Почему этот код
$(this).replaceWith(newElement);

не заменяет элемент на нужный мне?
text - грубо говоря тот же html код со своими нодами и так далее.
Я смотрел в справке и там куча примеров типа:
$( "button" ).click(function() {
  $( this ).replaceWith( "<div>" + $( this ).text() + "</div>" );
});

Единственное, что надо заменять не на элемент, а на его html код(но это все равно не сделало код работоспособным).

krasovsky 23.09.2014 08:36

Во первых скопировал твой код с небольшими изменениями (вставил линк в боди и передал его в твою функцию) - линк заменился на ссылку. Ты этого хотел? Если да то мои поздравления, все получилось.
$(this) в твоем коде - обращение к линк. после метода replaceWith он не переродился в ссылку, так вот обращайся к ссылке alert(newElement[0].tagName);

Грубо говоря чтоб яснее понять - открываем консоль записываем в переменную какой нибудь элемент. Удаляем этот элемент. Вызываем переменную - вуаля! В переменной сохранилась ссылка на элемент(не сам элемент! а ссылка на него.) То же самое и ты видишь когда пытаешься вызвать $(this)[0].tagName - $(this) все еще линк , он не стал ссылкой

ruzik 23.09.2014 12:18

Да вы были правы ошибка была в том, что text не был частью документа.
Спасибо за помощь!


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