Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   получить значение свойства class у div (https://javascript.ru/forum/events/7534-poluchit-znachenie-svojjstva-class-u-div.html)

Leax 07.02.2010 01:28

получить значение свойства class у div
 
Сразу извиняюсь за глупый вопрос (я совсем немного знаю JS): почему-то скрипт не работает (FF, GreaseMonkey)

В примере я хочу найти все div на странице и у первого попавшегося с существующим свойством class отобразить первые 6 символов этого свойства

Вот этот кусок никак не желает работать :cray:

var anchors = document.getElementsByTagName( 'div' );

for( var i = 0; i < anchors.length; i++ ) {
If (typeof anchors[i].className == "string") {
alert(anchors[i].className.substr(0,5));
break;
}
}

Помогите пожалуйста разобраться :help:

subzey 07.02.2010 01:42

Дело в том, что свойство className существует у всех нод-элементов (за счет прототипа), и все они имеют тип "string".

Cравнивайте строки явным образом:
anchors[i].className != ""


Да, и напишите «if» с маленькой буквы, яваскрипт регистрозависим . :)

Gvozd 07.02.2010 01:44

элемент еще не существует
выполните после того,как элемент будет созадн

subzey 07.02.2010 02:38

Цитата:

Сообщение от Leax
почему-то скрипт не работает (FF, GreaseMonkey)

Цитата:

Сообщение от Gvozd
элемент еще не существует

Быть не может! В Fx юзерскрипты стартуют по DOMContentLoaded.

А, вот, кстати, еще одно узкое место. НечистаяМакака использует для домовских объектов обвертки, так что вполне возможно, что вместо
anchors[i].className

придется написать
anchors[i].getAttribute("class")

Leax 07.02.2010 10:24

Цитата:

Сообщение от subzey (Сообщение 43823)
Дело в том, что свойство className существует у всех нод-элементов (за счет прототипа), и все они имеют тип "string".
Cравнивайте строки явным образом:
anchors[i].className != ""

Да, и напишите «if» с маленькой буквы, яваскрипт регистрозависим . :)

Большое спасибо, буду пробовать! :thanks:

Leax 07.02.2010 14:44

Проверил. Следующий код уже работает

var divs = document.getElementsByTagName( 'div' );
alert(divs.length);

for( var i = 0; i < divs.length; i++ ) {
if (divs[i].className.substr(0,4)== "timer") {
alert(divs[i].innerHTML);
break;
}
}

Попытался усложнить задачу: с помощью FireBug нашёл на странице значение class для интересующего div. Получилось, что class="timer xxx".

Вот только divs.length равно 11, хотя на этой странице этих div штук 200 (на разных уровнях вложенности).
Возникает вопрос: получается что
document.getElementsByTagName( 'div' );
возвращает не все элементы div? а только самого верхнего уровня?
как же тогда "докопаться" далеко вглубь и найти именно div с нужным значением class="timer xxx" ? :(

subzey 07.02.2010 14:48

Да нет, getElementsByTagName возвращает все, что есть в документе (на момент запуска).

Кстати, в FireFox Вы можете использовать .getElementsByClassName.

Leax 07.02.2010 15:00

Цитата:

Сообщение от subzey
Да нет, getElementsByTagName возвращает все, что есть в документе (на момент запуска).
Кстати, в FireFox Вы можете использовать .getElementsByClassName.

Странно. Значит содержимое страницы изменяется уже после загрузки...
Опять немного изменил код для проверки

var divs = document.getElementsByTagName( 'div' );
alert(divs.length);

for( var i = 0; i < divs.length; i++ ) { 
	if (divs[i].className!= "") {
		alert(divs[i].innerHTML);
		break;
	}
}


alert(divs.length) дает только 11 штук div
а alert(divs[i].innerHTML) отображает окно с огромной кучей html кода, в котором явно намного больше div, чем 11 штук.

Как же это может быть?

Leax 07.02.2010 20:00

Вопрос снимается, проблема решена внедрением в html-код кнопки с привязанным js-скриптом. Теперь после полной загрузки страницы всё работает отлично )


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