Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Удаление узла без удаления его потомков
 
 автор: вялый   (11.01.2008 в 22:19)   письмо автору
 
 

Возникла задача - нужно удалить узел без удаления потомков этого узла. Подскажите - в каком направлении копать: писать парсер, или как то через DOM попробовать.

   
 
 автор: SHAman   (11.01.2008 в 22:51)   письмо автору
 
   для: вялый   (11.01.2008 в 22:19)
 

DOM поможет, если xml валидный. Хотя бы тот кусок, который вас интересует. То есть, теги <p> закрыты, к примеру.

Я бы просто взял нужный элемент, вытащил из него содержимое innerHTML, нашел его родителя, удалил нужный элемент, вставил в родителя innerHTML.

   
 
 автор: bronenos   (11.01.2008 в 23:22)   письмо автору
 
   для: SHAman   (11.01.2008 в 22:51)
 

this.removeNode(false) можно на некоторых

   
 
 автор: вялый   (11.01.2008 в 23:30)   письмо автору
 
   для: bronenos   (11.01.2008 в 23:22)
 

Погуглю насчет этого метода, спасибо

   
 
 автор: вялый   (11.01.2008 в 23:43)   письмо автору
 
   для: bronenos   (11.01.2008 в 23:22)
 

Случайно не подскажите хорошие ресурсы по dhtml и DOM в частности? Порекомендуйте что нибудь

   
 
 автор: вялый   (11.01.2008 в 23:28)   письмо автору
 
   для: SHAman   (11.01.2008 в 22:51)
 

Наверно, немножко не то. Хочу сделать простенький WYSWYG редактор, и в этом редакторе функцию удаления элементов, например


<div>
    <div>  //напрмер, удалить этот узел
       <p>asdfkjsdlkjflsajdlfkj</p>  
       <img src="">
    </div> 
 <p>sadfsadfsadfasdf</p>
</div>


Но при использовании метода innerHTML данные добавляются в конец узла, а мне это не подходит, т.к. нарушится порядок следования элементов.

Наверное, я так думаю, проще будет написать парсер.

   
 
 автор: patience   (12.01.2008 в 17:11)   письмо автору
 
   для: вялый   (11.01.2008 в 23:28)
 

>Но при использовании метода innerHTML данные добавляются в конец узла, а мне это не подходит

SHAman
>Я бы просто взял нужный элемент, вытащил из него содержимое innerHTML, нашел его родителя, удалил нужный элемент, вставил в родителя innerHTML.


<html>
<head>
<title>Ex</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript">
function d(sCont, sDel) {
    var oContainer = document.getElementById(sCont);
    var sContent = oContainer.innerHTML;    
    var oEltoDel = document.getElementById(sDel);    
    var sNeedContent = oEltoDel.innerHTML;

    var sTag = oEltoDel.tagName;
    var oElreg = new RegExp("<"+ sTag + ' id\="?' + sDel + '"?>\\s*' + sNeedContent + "\\s*<\/" + sTag + ">", 'mi');
    oContainer.innerHTML = sContent.replace(oElreg, sNeedContent);    
    alert('Before: ' + sContent + ' \n\n\n After: ' + oContainer.innerHTML);
}    
</script>
</head>

<body>
<div id="container">
    <div id='del'>  //напрмер, удалить этот узел
       <p>asdfkjsdlkjflsajdlfkj</p>  
       <img src="">
    </div> 
 <p>sadfsadfsadfasdf</p>
</div> 

<input type="button" value="Show" onClick="d('container', 'del')" />
</body>
</html>



что-то вроде, без парсера...
уже к своим целям прилатаешь

   
 
 автор: вялый   (12.01.2008 в 17:54)   письмо автору
 
   для: patience   (12.01.2008 в 17:11)
 

Метод removeNode(false) как раз то, что нужно.

   
 
 автор: CNT   (12.01.2008 в 18:54)   письмо автору
 
   для: вялый   (11.01.2008 в 22:19)
 

Положим, ваш УЗЕЛ имеет id="myUZEL".
В Эксплорере задача решается на "раз-два-три":

var UZEL = document.all.myUZEL;
var PAPA = UZEL.parentElement;
PAPA.innerHTML = PAPA.innerHTML.split (UZEL.outerHTML).join (UZEL.innerHТML);

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

   
 
 автор: вялый   (16.07.2008 в 20:16)   письмо автору
 
   для: вялый   (11.01.2008 в 22:19)
 

Вот код:
function f(x){
var b=document.getElementById("id"+x);
if(b.removeNode)b.removeNode(false);
else
    {var child=b.childNodes;
    var childIns=b.parentNode.insertBefore(child[0],b.previousSibling)
    while(child[0])
         {
         childIns=b.parentNode.insertBefore(child[0],childIns)
         }
    }
}

тут потомки удаляемого узла добавляются родителю перебором: я не смог найти метода для добавления сразу всего списка childNodes родителю
Может, кто-то знает более элегантное решение? поделитесь

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования