Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с удалением данных из <select> (https://javascript.ru/forum/misc/3239-problema-s-udaleniem-dannykh-iz-select.html)

konstantinopol 31.03.2009 14:20

Проблема с удалением данных из <select>
 
Есть
Код:

<td><select name="Bundesland" id="Bundesland">
                                <option>Alle</option>
                                    </select>
                        </td>

и функция в которой вписываются значения в select
Код:

function box(region){
        for(h=0;h<region.length;h++){       
                abc=document.createElement('option');
                abc.innerHTML=region[h];
                document.getElementById('Bundesland').appendChild(abc);
        }
}

Но когда вызывается функция все предыдущие значения в select должны быть удалены. Я пробовал это с
document.getElementById('Bundesland').removeChild('option');

(вызываетса перед for)
но ничего не вышло. В чем я ошибся??

Kolyaj 31.03.2009 14:24

removeChild принимает ссылку на удаляемый элемент.

konstantinopol 31.03.2009 14:35

Что бы это значило??
Ну я и хочу удалить все option из select. Что совсем другое надо брать??
Или я неправильно понял функциональность removeChild ...

Kolyaj 31.03.2009 14:40

Строка не может являться ссылкой на элемент.

konstantinopol 31.03.2009 14:48

Либо я туплю либо ты что то не договариваешь.
Я немного потестировал и понял что так не пойдет как я писал в самом начале.
Но я не понимаю как мне отчистить select. Чёрт с ним с removeChild, можно ли это сделать другим способом???

Kolyaj 31.03.2009 14:58

document.getElementById('Bundesland').innerHTML = '';

konstantinopol 31.03.2009 15:01

Супер, спасибо тебе большое

"Вы должны добавить отзыв кому-то ещё, прежде чем сможете снова добавить его Kolyaj."

AzriMan 31.03.2009 15:31

несомненно,
document.getElementById('Bundesland').innerHTML = '';
будет проще всего. я бы сделал аналогично :)

а по поводу вопроса. что вы пытаетесь сделать этой строчкой?
document.getElementById('Bundesland').removeChild('option');

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


function removeElement(element)
{
	element.parentNode.removeChild(element);
	return true;
}

BundeslandOptions = document.getElementById('Bundesland').options;
for (var i=0; i<BundeslandOptions.length; i++)
	removeElement(BundeslandOptions[i]);




--edited.
(продублирую и в этом посте)
приведенный выше код будет производить очистку не до конца , если в селекте будет что-то еще кроме options.
для действительно полной очистки нужно проходиться по всем
document.getElementById('Bundesland').childNodes



--edited x2.
спасибо всем за поправки. приведенный выше код удалит элементы 'options' через одного. для полного удаления нужно воспользоваться циклом while.

konstantinopol 31.03.2009 16:18

Да это тоже можно сделать, просто я незнаю сколько элементов стояло в select до того как я внес туда новые значения. Поэтому сделал так как предложзил Kolyaj.
document.getElementById('Bundesland').removeChild('option');

Этой строкой я пытался очистить select

AzriMan 31.03.2009 16:25

мне без разницы как вы сделали.
у элемента Bundesland нет элемента option!!! у него есть массив с элементами option. поэтому нужно проходиться циклом по каждому элементу, т.к.
Цитата:

Сообщение от Kolyaj (Сообщение 15590)
removeChild принимает ссылку на УДАЛЯЕМЫЙ элемент.

понимаете/нет? ключевое слово - У-ДА-ЛЯ-Е-МЫЙ.

konstantinopol 31.03.2009 16:43

Теперь понял что вы от меня пытались до меня донести.

Вопрос какой из вариантов быстрее раборает ...

AzriMan 31.03.2009 16:52

Цитата:

Сообщение от konstantinopol (Сообщение 15619)
Теперь понял что вы от меня пытались до меня донести.

Вопрос какой из вариантов быстрее раборает ...

я от вас до вас ничего не пытался донести.

насчет быстродействия - мне интересно посмотреть, как вы будете рассуждать. что, по вашему мнению, будет выполняться быстрее? и почему?

konstantinopol 31.03.2009 17:03

Я бы сказал что вариант
document.getElementById('Bundesland').innerHTML = '';

будет выполняться быстрее. Потому, что в нем просто берётся элемент Bundesland и его содержимое приравниватся к пустому значеную(незнаю как правильно это описать). А во втором случае надо узнать величину масива и удалять каждый элемент по отдельности, а это занимает время.

Хотелось бы услышать ваше мнение.

AzriMan 31.03.2009 17:09

да. совершенно верно. как приятно, когда человек начинает рассуждать сам.

но только я внесу две поправки.

1. не путайте глаголы "приравниваться" и "присваиваться".

2. величина массива будет вычисляться каждую итерацию. вместе с удалением элемента.


--edited.
приведенный выше мною код будет производить очистку не до конца , если в селекте будет что-то еще кроме options.
для действительно полной очистки нужно проходиться по всем
document.getElementById('Bundesland').childNodes

konstantinopol 31.03.2009 17:19

Да, эти 2 момента я упустил. Впредь буду внимательнее.
Благодарю за потраченое на меня время, теперь я вроде разобрался в этой теме.

AzriMan 31.03.2009 17:23

Пожалуйста. обращайтесь еще.

Kolyaj 31.03.2009 17:26

Цитата:

Сообщение от AzriMan
BundeslandOptions = document.getElementById('Bundesland').options;
for (var i=0; i<BundeslandOptions.length; i++)
    removeElement(BundeslandOptions[i]);

А только мне кажется, что в данном случае удалится только половина элементов через одного?

ZoNT 31.03.2009 17:33

это частая ошибка при удалении... Надо использовать while

AzriMan 31.03.2009 17:53

да, совершенно верно. удалится половина элементов через одного.
был вопрос про options, я и написал для options.

потом через несколько постов внес правку:

--edited.
приведенный выше мною код будет производить очистку не до конца , если в селекте будет что-то еще кроме options.
для действительно полной очистки нужно проходиться по всем
document.getElementById('Bundesland').childNodes


но, можно и через while. по сути, через while, даже, будет быстрее :)

Kolyaj 31.03.2009 17:57

AzriMan,
он удалит options через одного.

AzriMan 31.03.2009 18:05

да. действительно. спасибо. раньше не приходилось сталкиваться с этим. на будущее, если будет необходимо - буду делать через while.

если у кого-то возникнет вопрос, а почему options удалятся через одного? - поясняю.
BundeslandOptions = document.getElementById('Bundesland').options;
for (var i=0; i<BundeslandOptions.length; i++)
    removeElement(BundeslandOptions[i]);

допустим, есть список:
BundeslandOptions[0] = 0
BundeslandOptions[1] = 1
BundeslandOptions[2] = 2
BundeslandOptions[3] = 3
BundeslandOptions[4] = 4

после удаления BundeslandOptions[0] список примет вид:
BundeslandOptions[0] = 1
BundeslandOptions[1] = 2
BundeslandOptions[2] = 3
BundeslandOptions[3] = 4
, в то время, как i уже будет равен единице. следовательно элемент "BundeslandOptions[0] = 1" пропустится из удаления.


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