Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как сравнить класс, если их много!? (https://javascript.ru/forum/events/1652-kak-sravnit-klass-esli-ikh-mnogo.html)

Sc@M 28.08.2008 17:25

Как сравнить класс, если их много!?
 
пример HTML-кода:
<div id="test" class="file active"></div>

getElementById('test').className даёт "file active"

нужно сделать сверку типа:
if(getElementById('test').className == 'конкретный класс') {}

суть: если у элементов классов много, как узнать, есть ли среди них нужный?!

ZoNT 28.08.2008 18:03

регулярные выражения тебе помогут.

Sc@M 28.08.2008 18:33

Регулярки это конешно хорошо и замечательно! И такая мысль мне естественно в голову приходила.
Я только начал писать на JavaScript, но имею большой опыт кодинга на PHP!
Меня интересует возможность произвести сверку на уровне свойства элемента как объекта DOM! Как более изощрённый и грамотный метод!
А не подходить к проблеме сзади :)

Kolyaj 28.08.2008 18:52

Почему сзади? Нормальный подход.
function hasClassName(elem, cl) {
  return (new RegExp('(^|\s)' + cl + '(\s|$)')).test(elem.className);
}

ZoNT 28.08.2008 18:58

регулярки как раз позволяют подходить спереди... :)

Я тут задачу решал на разбор формул и выполнение в браузере, так вот в компилируемо языке приходится разбирать формулу по кусочкам, а с помощью пары регулярок и эвала можно сделать это просто и красиво..

Sc@M 28.08.2008 19:03

:)
хорошо, убедили! спасибо :)
если кто-то знает другой подход к данному вопросу, просьба высказаться! :)

Kolyaj 28.08.2008 19:32

Если щас прибегут и скажут, что можно разбивать строку по пробелам на массив, а потом проверять, если ли в этом массиве искомый класс, вы им не верьте :)

Sc@M 28.08.2008 19:53

остроумно :)
такими извратами я страдал, когда делал первые шаги на PHP :)
ребят, отнеситесь серьёзно.
Я нормальный программер, но только на PHP :)
просто исторически сложилась так, что с JavaScript вовремя не подружился.

Я имел ввиду !_принципиально_! другой подход если кто знает, пусть не молчит!
а не хотел смотреть на те же яйца только в профиль :)))

Kolyaj 28.08.2008 20:00

Да нету других подходов.

Octane 29.08.2008 00:24

Нету никаких таких средств :D даже в самых современных браузерах можно только выполнить поиск по нескольким классам node.getElementsByClassName('className1 className2');
Поэтому используй регулярные выражения. Если кажутся громоздкими коды, которые тебе написали ранее, можно немного сократить функцию:
function hasClass(str, search) {
	return !!(str.search('\\b' +  search + '\\b') + 1);
}

hasClass(node.className, 'className') - возвратит true или false в зависимости от наличия указанного класса.

Говорят, что при использовании мета-символа '\b' (граница слова) в древнейших браузерах бывают проблемы, лично я не сталкивался, в IE5 - работает...

Можно пойти дальше и добаить в прототип объекта String новый метод
String.prototype.hasClass = function(str) {
	return this.search('\\b' +  str + '\\b') + 1;
}

Используем так:
node.className.hasClass('className')

Вернет 0 - если класс не найден или индекс+1 первого вхождения подстроки с именем класса в строке className :cool:

p.s. последний вариант больше всего похож на стандартный метод ;) для успокоения совести ))))

Sc@M 29.08.2008 12:05

прекрасно!
а как вам вариант:
elem.className.IndexOf('class') >= 0
И НЕ НУЖНЫ НИКАКИЕ РЕГУЛЯРКИ! как посоветовали коллеги ранее :)
ЗАЧЕМ?!

Kolyaj 29.08.2008 12:17

Sc@M, а вы подумайте.

З.Ы. И indexOf, а не IndexOf.

Sc@M 29.08.2008 12:23

Цитата:

Сообщение от Kolyaj (Сообщение 5126)
З.Ы. И indexOf, а не IndexOf.

Ссори, просто очепятка (в коде у себя правильно написал :) ), говорю, на JavaScript второй день пишу ... думаю вы меня понимаете :)

не знаю, прошу дать ответ "в чём разница" и где будет сбой о камни? :)

ZoNT 29.08.2008 12:23

ну вот есть у меня класс "figoviyclass red",тогда:
elem.className.indexOf('class') = 7 >0
ошибочка, понимаиш...

Sc@M 29.08.2008 12:32

ZoNT, не очень :(
какой случай ты рассматриваешь?
такой:
elem.className.indexOf('figoviyclass red') >= 0
где className = 'blablabla figoviyclass red blablabla'
так вхождение строки же найдётся! пробел тоже символ :)

ZoNT 29.08.2008 12:40

ты что читать не умеешь???
Цитата:

ну вот есть у меня класс "figoviyclass red",тогда:
elem.className.indexOf('class') = 7 >0
ошибочка, понимаиш...
elem.className = "figoviyclass red";
elem.className.indexOf('class') выдаст 7, то есть >=0, то есть как будто бы 'class' присутствует в классе этого элемента. Но его-то там нет!!! Там есть "figoviyclass"!!!

Sc@M 29.08.2008 12:47

:)
понял ;)
сразу не вогнал :) ... утро :) ...


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