Страница 1 из 1

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

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

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

set t = document.all.item("MyItemID")
возвращает HTML элемент с указанным ID, однако, если на странице таких элементов несколько, то возвращается коллекция элементов. Как мне в скрипте узнать тип возвращённого объекта: элемент или коллекция?

Добавлено: 24 мар 2005, 21:21
Oscar

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

<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

Сейчас точно вспомнить не могу.
И конечно же, вполне соглашусь, если кто-то скажет, что моё решение не совсем "чистое".

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

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

<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>

Добавлено: 25 мар 2005, 11:36
Romeo
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)

re

Добавлено: 25 мар 2005, 12:21
Bagin

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

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

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

If Not IsNull(el.length) Then
.........

Добавлено: 25 мар 2005, 12:55
Romeo
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 скриптах, как свинья в помоях :) .

Добавлено: 25 мар 2005, 17:11
AiK
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>

Добавлено: 25 мар 2005, 17:54
Romeo
Спасибо, дружище AiK, помогло!