Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Поиск объекта по class (https://javascript.ru/forum/events/2526-poisk-obekta-po-class.html)

Krappt 10.01.2009 19:13

Поиск объекта по class
 
Здравствуйте!

У меня есть скрипт, который отвечает за прокрутку контента в div'e:
function init(id) {
  var obj = document.getElementById(id);
  if (obj) {
    obj.state = 0;//инициализируем состояние
    obj.timer = null;
    obj.maxVert = obj.scrollHeight - obj.offsetHeight;//максимальная высота прокрутки
  }
}
function scroll_down(id,timer) {
  var obj = document.getElementById(id);//получаем объект по ID
  if (!obj.maxVert) init(id);//если объект еще не иниициализировался - инициализируем
  if (timer == undefined) obj.state = 1;//если не передан второй параметр timer, значит вызов был от кнопки прокрутки, ставим состояние прокрутки вниз	
  if ((obj.maxVert > obj.scrollTop) && (obj.state == 1)) {//если не достигли предела и состояние прокрутки все еще "вниз"(1)
    obj.scrollTop = obj.scrollTop + 10;//добавляем смещение прокрутки на 10 пикселей
    obj.timer = setTimeout('scroll_down(\''+id+'\',true)',100);//устанавливаем таймер вызова этой же функции для дальнейшей прокрутки
  }
}
function scroll_up(id,timer) {
  var obj = document.getElementById(id);//получаем объект по ID
  if (!obj.maxVert) init(id);//если объект еще не иниициализировался - инициализируем
  if (timer == undefined) obj.state = -1;//если не передан второй параметр timer, значит вызов был от кнопки прокрутки,ставим состояние прокрутки вверх	
  if ((obj.scrollTop > 0) && (obj.state == -1)) {//если не достигли начала и состояние прокрутки все еще "вверх"(-1)
    obj.scrollTop = obj.scrollTop > 10 ? obj.scrollTop - 10 : 0;//добавляем смещение прокрутки на 10 пикселей
    obj.timer = setTimeout('scroll_up(\''+id+'\',true)',100);//устанавливаем таймер вызова этой же функции для дальнейшей прокрутки
  }
}

function scroll_stop(id) {
  var obj = document.getElementById(id);//получаем объект по ID
  if (obj) {
    if (obj.timer) clearTimeout(obj.timer);
    obj.state = 0;
  }

}


Прошу обратить внимание, что скрипт использует поиск по id'y, можно ли как-то сделать, чтобы он искал по классам?

Заранее благодарен.

Octane 10.01.2009 19:38

Для поиска элементов по имени класса можно использовать в новых браузерах метод getElementsByClassName и его эмуляцию для старых браузеров. В любом случае простой заменой getElementById на getElementsByClassName вам не обойтись, скрипт нужно полностью переписать, чтобы иметь возможность работать с несколькими элементами.

Krappt 10.01.2009 19:42

Спасибо за ответ. в JS я, мягко говоря, ноль. Использую готовые скрипты, но к сожалению найти подобный скрипт под классы я не смог.

Вы не можете что-либо подсказать?

Gvozd 10.01.2009 21:17

http://javascript.ru/forum/misc/2464...-stranicy.html
ЗЫ третья ссылка по форумному поиску по слову class

twolf 11.01.2009 17:02

function getElementsByClass(cls, node, tag)
{
    if(document.getElementsByClass) return document.getElementsByClass(cls, node, tag); 
    if(! node) node = document;
    if(! tag)  tag  = '*';
    var them = node.getElementsByTagName(tag),
        rez  = [];
    for(var notI = 0; notI < them.length; ++notI)
        if(them[notI].className == cls) rez.push(them[notI]);
    return rez;
}

Octane 11.01.2009 19:22

Цитата:

Сообщение от twolf (Сообщение 10563)
…
if(document.getElementsByClass) return document.getElementsByClass(cls, node, tag);
…

twolf, какой смысл этой строчки?

И классов может быть несколько (перечислены через пробел), многие верстальщики знают о этой возможности и активно её используют, поэтому ваша функция будет работать далеко не везде.

Функция должна выглядеть примерно таким образом: getElementsByClassName

twolf 12.01.2009 12:45

ну функция то не моя. а доработанная Дастина Диаса.
а вот тут можно посмотреть спидтест по аналогичным функциям.

Такая будет работать и с пробелами
function getElementsByClass(cls, node, tag)
{
  if(! node) node = document;
  if(! tag)  tag  = '*';
  var them = node.getElementsByTagName(tag),
  var rez  = [];
  cls = " " + cls + " ";
  for(var notI = 0; notI < them.length; ++notI){
    var classString = " " + them[notI].className + " ";
    if(classString.indexOf(cls) != -1) rez.push(them[notI]);
  }
  return rez;
}

Octane 12.01.2009 13:00

Эта функция будет работать не правильно.

dector@yandex.ru 10.03.2009 23:52

Это все ерунда
 
Зачем в диве прокручивать контент? Он прокручивается сам, если у дива поставить свойство стиля overflow:auto. Появится скролл и все будет прокручиваться само

Kolyaj 11.03.2009 00:00

Цитата:

Сообщение от dector@yandex.ru
Зачем в диве прокручивать контент?

Есть такая задача у некоторых деятелей интернет-индустрии -- дать возможность посмотреть контент, но максимально сложно :)


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