Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2009, 19:48
Diem
 
Сообщений: n/a

Замена элемента со всеми потрохами
Есть ли универсальный способ заменить существующий DOM элемент, вместе с самим тегом и параметрами по аналогии с replaceChild(), но без предварительного создания средствами document.createElement(), то есть новый эелемент перед заменой имеется только в виде текстовой переменной (html).

спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 23.07.2009, 22:02
Diem
 
Сообщений: n/a

Пока только вот такое в голову пришло.

function replace_element_by_html(target, html)
{
    var tmpNode = document.createElement('div');
    tmpNode.innerHTML = html;
    
    for (key in tmpNode.childNodes)
    {
        target.parentNode.insertBefore(tmpNode.childNodes[key].cloneNode(true), target);
    }
    
    target.parentNode.removeChild(target);
}


Не очень конечно с точки зрения производительности.
Ответить с цитированием
  #3 (permalink)  
Старый 24.07.2009, 09:51
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Попробуй так:
function replace_element_by_html(ele, html){
    var newEle=ele.cloneNode(false);
    newEle.innerHTML=html;
    ele.parentNode.insertBefore(newEle, ele);
    ele.parentNode.removeChild(ele);
}
Ответить с цитированием
  #4 (permalink)  
Старый 24.07.2009, 10:24
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от B~Vladi
Попробуй так:
Один тег (newEle) лишний будет.
Ответить с цитированием
  #5 (permalink)  
Старый 24.07.2009, 10:25
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Сообщение от Riim
Один тег (newEle) лишний будет.
Что то не соображу... Как по-другому записать?!
Ответить с цитированием
  #6 (permalink)  
Старый 24.07.2009, 10:34
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от B~Vladi
Что то не соображу... Как по-другому записать?!
Вместо ele.parentNode.insertBefore(newEle, ele);
переписывать не newEle, а в цикле все его содержимое.
Но это все равно противоречит ТС:
Цитата:
без предварительного создания средствами document.createElement()
cloneNode, createDocumentFragment и прочие это все тот же createElement (ну почти).
Ответить с цитированием
  #7 (permalink)  
Старый 24.07.2009, 11:36
Diem
 
Сообщений: n/a

Сообщение от B~Vladi Посмотреть сообщение
Попробуй так:
function replace_element_by_html(ele, html){
    var newEle=ele.cloneNode(false);
    newEle.innerHTML=html;
    ele.parentNode.insertBefore(newEle, ele);
    ele.parentNode.removeChild(ele);
}
В вашем примере будет обновленно только сожержимое ele, сам тег с параметрами останется прежним.
Всё же неважно, решение найденно.

Можно также делать cloneNode родительского элемента и манипулировать с ним, но в некоторых случаях это будет накладнее по ресурсам.

P.S. такой вопрос:
может существует стандартная функция которая переводит html в коллекцию элементов, никто не в курсе ?
Ответить с цитированием
  #8 (permalink)  
Старый 24.07.2009, 11:51
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Diem
может существует стандартная функция которая переводит html в коллекцию элементов, никто не в курсе ?
Стандартной не существует, но можно во фреймворках посмотреть реализацию.
Ответить с цитированием
  #9 (permalink)  
Старый 24.07.2009, 14:44
Аспирант
Отправить личное сообщение для Pattern Посмотреть профиль Найти все сообщения от Pattern
 
Регистрация: 13.05.2009
Сообщений: 37

Сообщение от Diem Посмотреть сообщение
может существует стандартная функция которая переводит html в коллекцию элементов, никто не в курсе ?
есть стандартное и доступное каждому решение, которое вы сами написали выше, и которое указали вам другие
function html2hodes(h){
var newEl=document.createElement('span');
newEl.innerHTML=h;
return newEl.childNodes;
}

Однако я голову уже сломал размышляя, почему нельзя использовать createElement? Что в нём такого запретного?
Ответить с цитированием
  #10 (permalink)  
Старый 25.07.2009, 23:48
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Pattern
Однако я голову уже сломал размышляя, почему нельзя использовать createElement? Что в нём такого запретного?
оставь в покое свою голову, не на все вопросы стоит искать ответ

по теме можно еще DocumentFragment попробовать заюзать
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление элемента на странице ajax-ом Urfin jQuery 1 24.07.2009 18:40
Границы элемента DIv gosha_kap Общие вопросы Javascript 1 06.07.2009 17:12