Страница 1 из 1
Элемент или Коллекция?
Добавлено: 24 мар 2005, 14:48
Romeo
Господа, возникла проблема. Имею HTML страничку с VB скриптом. Следующая конструкция
возвращает 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
или наоборот:
Добавлено: 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, помогло!