Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.02.2010, 01:28
Аспирант
Отправить личное сообщение для Leax Посмотреть профиль Найти все сообщения от Leax
 
Регистрация: 03.06.2009
Сообщений: 67

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

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

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

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

Помогите пожалуйста разобраться
Ответить с цитированием
  #2 (permalink)  
Старый 07.02.2010, 01:42
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

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

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


Да, и напишите «if» с маленькой буквы, яваскрипт регистрозависим .
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2010, 01:44
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

элемент еще не существует
выполните после того,как элемент будет созадн
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2010, 02:38
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Сообщение от Leax
почему-то скрипт не работает (FF, GreaseMonkey)
Сообщение от Gvozd
элемент еще не существует
Быть не может! В Fx юзерскрипты стартуют по DOMContentLoaded.

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

придется написать
anchors[i].getAttribute("class")
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2010, 10:24
Аспирант
Отправить личное сообщение для Leax Посмотреть профиль Найти все сообщения от Leax
 
Регистрация: 03.06.2009
Сообщений: 67

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

Да, и напишите «if» с маленькой буквы, яваскрипт регистрозависим .
Большое спасибо, буду пробовать!
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2010, 14:44
Аспирант
Отправить личное сообщение для Leax Посмотреть профиль Найти все сообщения от Leax
 
Регистрация: 03.06.2009
Сообщений: 67

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

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" ?
Ответить с цитированием
  #7 (permalink)  
Старый 07.02.2010, 14:48
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

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

Кстати, в FireFox Вы можете использовать .getElementsByClassName.
Ответить с цитированием
  #8 (permalink)  
Старый 07.02.2010, 15:00
Аспирант
Отправить личное сообщение для Leax Посмотреть профиль Найти все сообщения от Leax
 
Регистрация: 03.06.2009
Сообщений: 67

Сообщение от 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 в 19:16.
Ответить с цитированием
  #9 (permalink)  
Старый 07.02.2010, 20:00
Аспирант
Отправить личное сообщение для Leax Посмотреть профиль Найти все сообщения от Leax
 
Регистрация: 03.06.2009
Сообщений: 67

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение аттрибута вложенного тэга по id losk Events/DOM/Window 4 21.11.2009 10:08
как получить значение NAME по ID zerg Элементы интерфейса 7 25.09.2009 02:42
Как узнать значение свойства СSS у элемента? Antt Общие вопросы Javascript 3 16.09.2009 17:39
получить значение из select'a rrb Элементы интерфейса 5 29.05.2009 15:32
Получить значение ID через this gcolor Events/DOM/Window 5 14.01.2009 18:05