Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Удаление всех options в select (https://javascript.ru/forum/dom-window/33516-udalenie-vsekh-options-v-select.html)

Ceргей 26.11.2012 15:16

Удаление всех options в select
 
Не могу разобраться в логике javascript`а.
Тестировано в Operе Linux
Пытаюсь удалить все options таким методом, что-то остается удаляется не все:
function del(id){
var sel = window.document.getElementById(id);
var opts = sel.options;
for(var i = 0; i<opts.length; i++){
opts[i] = null;
}
}

Но когда удаляю другим способом, все удаляется
function del(id){
var sel = window.document.getElementById(id);
var opts = sel.options;
while(opts.length > 0){
opts[opts.length-1] = null;
}
}

Кто-нибудь знающий может объяснить, почему не работает первый способ???
Очень важно понять логику работы, без нее никуда

ksa 26.11.2012 15:59

Цитата:

Сообщение от Ceргей
Пытаюсь удалить все options

Как вариант...

<!DOCTYPE html>
<html>
<head>
<!--
<script src="http://code.jquery.com/jquery-latest.js"></script>
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
</style>
<script type="text/javascript">
function test() {
	document.getElementById('test').innerHTML='';
};
</script>
</head>
<body>
<select id='test'>
	<option></option>
	<option>1</option>
	<option>2</option>
	<option>3</option>
</select>
<button onclick='test()'>Del</button>
</body>
</html>

danik.js 26.11.2012 16:28

Потому что это коллекция а не массив. И после каждого удаления она становится короче и индексы перестраиваются (вроде бы)

Ceргей 27.11.2012 04:31

Цитата:

Сообщение от danik.js (Сообщение 217944)
Потому что это коллекция а не массив. И после каждого удаления она становится короче и индексы перестраиваются (вроде бы)

А вообще есть ли разница в работе циклов если ты работаешь с коллекциями и массивами?
И если есть, то пожалуйста, объясните какая

ksa 27.11.2012 08:53

Цитата:

Сообщение от Ceргей
есть ли разница в работе циклов если ты работаешь с коллекциями и массивами?

В JS есть массивы и объекты... Где массив частный случай объекта (в моём понимании).
У массива индексы только целые числа. У объекта индексами может быть не только целые и не только числа...

ksa 27.11.2012 08:55

Цитата:

Сообщение от danik.js
после каждого удаления она становится короче и индексы перестраиваются

Просто длина уменьшается... :)

danik.js 27.11.2012 11:09

var collection = document.createElement('select').options

collection // []
collection instanceof Array // false
collection instanceof HTMLCollection // true
collection.push // undefined

collection.add(document.createElement('option'))
collection.add(document.createElement('option'))

collection // [ <option>​</option>​, <option>​</option>​ ]
collection.length //2
collection[0] // <option>​</option>​
collection[1] // <option>​</option>​

collection[0] = null

collection.length // 1
collection[0] // <option>​</option>​
collection[1] // undefined

var array = []
array // []
array instanceof Array // true

array.push('a')
array.push('b')

array // ["a", "b"]
array.length // 2

array[0] = null  //array [null, "b"]

array.length //2


коллекция - "живой" набор элементов. Если элемент из набора исчезает или добавляется коллекция тутже меняется. Присваивая collection[i] = null мы удаляем ссылку на элемент, и элемент из коллекции автоматически исчезает. Присваивая array[i] = null , мы просто выставляем значение элементу массива null, сам массив не меняется.

ksa 27.11.2012 13:27

danik.js, спасибо за разъяснение. :yes:

melky 27.11.2012 16:49

Цитата:

Сообщение от danik.js
коллекция - "живой" набор элементов. Если элемент из набора исчезает или добавляется коллекция тутже меняется. Присваивая collection[i] = null мы удаляем ссылку на элемент, и элемент из коллекции автоматически исчезает. Присваивая array[i] = null , мы просто выставляем значение элементу массива null, сам массив не меняется.

я называю эту структуру данных "жидкий лист" (Fluid List).

как она правильно называется??

ksa 28.11.2012 08:36

Цитата:

Сообщение от melky
как она правильно называется?

В MSDN так и писали collection...


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