Элемент или Коллекция?

Обсуждение вопросов клиентского программирования.

Модератор: Duncon

Ответить
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Господа, возникла проблема. Имею HTML страничку с VB скриптом. Следующая конструкция

Код: Выделить всё

set t = document.all.item("MyItemID")
возвращает HTML элемент с указанным ID, однако, если на странице таких элементов несколько, то возвращается коллекция элементов. Как мне в скрипте узнать тип возвращённого объекта: элемент или коллекция?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

<form onSubmit="alert(document.getElementById(0)); return false">
<input id="1" name="td1" type="radio">t1

<input id="0" name="td2" type="radio">t2

<input id="0" name="td2" type="radio">t3

<input type="Submit" value="Send">
</form>
Выдаёт "object" (при более точном анализе - первый элемент), а не коллекцию.
По этому, приведите, пожалуйста ваш код, который таки возвращает коллекцию.

Но сама проблема мне знакома, когда-то я с ней боролся.

То ли я проверял:
t.length!=null
то ли
t[0] != null

Сейчас точно вспомнить не могу.
И конечно же, вполне соглашусь, если кто-то скажет, что моё решение не совсем "чистое".
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Мне удалось восстановить конструкцию с возвратом коллекции.
Надеюсь следующий код поможет разобраться:

Код: Выделить всё

<script>
function check(fform){
	for(i=0;i<5;i++)
		checkElement(fform.elements['td'+i]);
}

function checkElement(elem){
	if (elem.length!=null)
		for(i=0;i<elem.length;i++)
			alert(elem[i].value);
	else
		alert(elem.value);
}
</script>
<form onSubmit="check(this); return false">
<input id="0" name="td0" value="td0" type="radio" checked>t0

<input id="1" name="td1" value="td1" type="radio" checked>t1

<input id="2" name="td2" value="td2_1" type="radio" checked>t2

<input id="2" name="td2" value="td2_2" type="radio">t2

<input id="3" name="td3" value="td3" type="radio" checked>t3

<input id="4" name="td4" value="td4" type="radio" checked>t4

<input type="Submit" value="Send">
</form>
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Oscar, большое спасибо за отклик. Приведённый пример практически на 100% соответствует моей проблеме. Неприятность в том, что у меня есть именно VB скрипт и от этого никак не уйти. В Java скрипте всё просто потому, что он максимально приближен к C++ и имеет ту же гибкость. Если мы пишем el.length - интерпритатору понятно, что мы имеем ввиду адрес метода, если пишем el.length(), то имеем ввиду результат вызова этого метода.

В VB такого не проходит: и в том и в том случае конструкция расценивается, как вызов метода и если el, оказыватеся не коллекцией, а простым элементом, то всё падает c ошибкой: Object doesn't support this property or method: el.length. Специалисты VB скрипта, помогите разобраться. Задача горит!

Пробовал варианты:

Код: Выделить всё

if (el.length = null)
if (el.length is Nothing)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Bagin
Сообщения: 9
Зарегистрирован: 24 мар 2005, 10:16

Код: Выделить всё

If IsNull(el.length) Then
.........
.........
Else
.........
.........
End If
или наоборот:

Код: Выделить всё

If Not IsNull(el.length) Then
.........
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Bagin, всё равно не работает. Я пока сделал следующую затычку, но хотелось бы узнать правильное решение.

Код: Выделить всё

set labelcoll = document.all.item("notelabel")
		
' temporary resolution the the "element or collection" problem
CollLength = 0
On Error Resume Next
CollLength = labelcoll.length
On Error Goto 0
		
if (CollLength > 0) then
	for i = 0 to CollLength - 1
		labelcoll.item(i).style.backgroundcolor = UnSelectedBgColor
		labelcoll.item(i).style.color = UnSelectedColor
	next	
else
	labelcoll.style.backgroundcolor = UnSelectedBgColor
	labelcoll.style.color = UnSelectedColor
end if
Aik, Absurd, помогите коллеге. Я в VB скриптах, как свинья в помоях :) .
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Romeo, я в VB не лучше тебя разбираюсь :)
Поэтому могу порекомендовать только то, что всегда рекомендую: никогда не обращатся к коллекциям напрямую (они всегда себя как-то неадекватно ведут),
а использовать методы DHTML:

Код: Выделить всё

<html>
<body>
<script language="VBScript">
Sub testIT (name)
    set labelcoll  = document.getElementsByName(name)
    for each itm in labelcoll
        alert(itm.innerText)
    next   
End Sub
</script>
<div ID="label">
    Label1
</div>
<div ID="label">
    Label2
</div>
<div ID="anotherlabel">
    Another Label
</div>

<form>
    <input type="button" value="Go1" onClick="testIT('label')">
    <input type="button" value="Go2" onClick="testIT('anotherlabel')">
    <input type="button" value="Go3" onClick="testIT('nothing')">
</form>

</body>
</html>
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Спасибо, дружище AiK, помогло!
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить