Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2010, 18:53
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

getElementsByTagName и parentNode.removeChild
Приветствую, всех кто читает этот топик, какая-то хрень со связкой getElementsByTagName и parentNode.removeChild, в цикле почему то удаляет только по одному элементу, то есть надо вызвать цикл два раза чтобы удалить два элемента с такими тегами, простейший пример:
<script type="text/javascript">
function ulsdel(){
var UlList=document.getElementById('uls').getElementsByTagName('ul');
for(i=0; i<UlList.length; i++){
UlList[i].parentNode.removeChild(UlList[i])}
}
</script>
<div id="uls">
<ul><li>первый</li><li>первый</li><li>первый</li><li>первый</li></ul>
<ul><li>второй</li><li>второй</li><li>второй</li><li>второй</li></ul>
</div>
<input type="button" onclick="ulsdel()" value="Удалить UL">

Приходится нажимать кнопку два раза, чтобы удалить эти два тега ul, каждое нажатие удаляет один из них, а например если не parentNode.removeChild, а innerHTML, всё работает идеально, подскажите, пожалуйста, может есть тонкости с getElementsByTagName и parentNode.removeChild?
Ответить с цитированием
  #2 (permalink)  
Старый 23.07.2010, 19:05
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

<script type="text/javascript">
function ulsdel(){
var UlList=document.getElementById('uls').getElementsByTagName('ul');
for(i=0; i<UlList.length; i++){
alert(UlList.length);
UlList[i].parentNode.removeChild(UlList[i])
alert(UlList.length);
}
}
</script>
<div id="uls">
<ul><li>первый</li><li>первый</li><li>первый</li><li>первый</li></ul>
<ul><li>второй</li><li>второй</li><li>второй</li><li>второй</li></ul>
</div>
<input type="button" onclick="ulsdel()" value="Удалить UL">
Ответить с цитированием
  #3 (permalink)  
Старый 23.07.2010, 19:30
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

Ааа, ну теперь понятно, тут счётчик должен не постинкрементироваться, а умножаться на 2:
<script type="text/javascript"> 
function ulsdel(){ 
var UlList=document.getElementById('uls').getElementsByTagName('ul'); 
for(i=0; i<UlList.length; i*2){ 
UlList[i].parentNode.removeChild(UlList[i]) 
} 
} 
</script> 
<div id="uls"> 
<ul><li>первый</li><li>первый</li><li>первый</li><li>первый</li></ul> 
<ul><li>второй</li><li>второй</li><li>второй</li><li>второй</li></ul> 
</div> 
<input type="button" onclick="ulsdel()" value="Удалить UL">

B@rmaley.e><e, спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 23.07.2010, 21:21
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Лучше использовать обход в обратном порядке
<script type="text/javascript">
function ulsdel(){
var UlList=document.getElementById('uls').getElementsByTagName('ul');
for(i=UlList.length; i--;){
UlList[i].parentNode.removeChild(UlList[i])}
}
</script>
<div id="uls">
<ul><li>первый</li><li>первый</li><li>первый</li><li>первый</li></ul>
<ul><li>второй</li><li>второй</li><li>второй</li><li>второй</li></ul>
</div>
<input type="button" onclick="ulsdel()" value="Удалить UL">
Ответить с цитированием
  #5 (permalink)  
Старый 23.07.2010, 22:13
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Лучше все-таки innerHTML обнулять, но если сильно хочется, то обычный while

while (UlList.length) {
    UlList[0].parentNode.removeChild(UlList[0]);
}
Ответить с цитированием
  #6 (permalink)  
Старый 24.07.2010, 08:00
Аватар для Vulkan
Профессор
Отправить личное сообщение для Vulkan Посмотреть профиль Найти все сообщения от Vulkan
 
Регистрация: 25.05.2010
Сообщений: 511

Kolyaj, дело в том что тут генерирующиеся менюшки в одном диве и в этом диве есть ещё и кнопки. поэтому если обнулять див то удалятся не только меню, а если создать для меню отдельный див скрипт начинает лагать, потому что я там уже всё четко подстроил, придётся несколько перестраивать, так что обнуление innerHTML не подходит, но за совет спасибо, буду использовать while.
B@rmaley.e><e, спасибо за помощь, тебе + не могу поставить так как вылазит ограничение на увеличение репутации, я тебе недавно ставил, поэтому система не даёт тебе повысить репу.

Добавлено спустя некоторое время:
while не работает когда в диве найден только один элемент.

Последний раз редактировалось Vulkan, 24.07.2010 в 11:17.
Ответить с цитированием
  #7 (permalink)  
Старый 24.07.2010, 14:30
Аватар для float
Профессор
Отправить личное сообщение для float Посмотреть профиль Найти все сообщения от float
 
Регистрация: 01.07.2010
Сообщений: 387

Цитата:
i=0; i<UlList.length; i*2
i*2=0(always)

Описание ситуации:
в уллисте 2 нода[0],[1].
В первом цикле удаляется [0]. i++(=1). В уллисте 1 нод[0]<=положение 2-го нода после удаления 1-го
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
getElementsByTagName для нескольких тэгов MaxB Events/DOM/Window 11 07.12.2011 23:29
getElementsByTagName is not a function чтение XML Arfey Общие вопросы Javascript 12 08.06.2010 15:09
getElementsByTagName в массив gooody Events/DOM/Window 2 22.01.2010 13:33