Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить содержимое всех className! (https://javascript.ru/forum/misc/35153-poluchit-soderzhimoe-vsekh-classname.html)

lamer 01.02.2013 06:06

Получить содержимое всех className!
 
Здравствуйте, подскажите пожалуйста как получить содержимое всех className и разделить их символом "-" ?

У меня находит только содержимое первого класса:

<html>

<head>
</head>

<body>
<div class="info">111</div>
<div class="info">222</div>
<div class="info">333</div>
<br>
<input type="button" value="search" onclick="search();">

<script>
function search() {
	getElementsByClass = function(classList, node) {
		var node = node || document,
		list = node.getElementsByTagName('*'),
		length = list.length,
		classArray = classList.split(/\s+/),
		classes = classArray.length,
		result = [], i,j
		for(i = 0; i < length; i++) {
			for(j = 0; j < classes; j++)  {
				if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
					result.push(list[i])
					break
				}
			}
		}
		return result
	}

var elements = getElementsByClass('info');
for (i=0; i < elements.length; i++) {
	if (elements[i].className == 'info') {
		alert(elements[i].textContent || elements[i].innerText || ""); break;
	}
}
}
</script>
</body>

</html>


В результате чтоб вышло примерно так:
111 - 222 - 333

danik.js 01.02.2013 07:55

1) Используйте document.getElementsByClassName метод. Для IE7-8 добавлен костыль.
2) break останавливает цикл. Поэтому ваш код обрабатывает только первый элемент
3) Раз мы уже выбрали элементы с классом info, то зачем еще одна проверка?
4) Перед i потеряли ключевое слово var, в итоге объявили ее как глобальную.

С учетом сказанного выше:

<html>
 
<head>
</head>
 
<body>
<div class="info">111</div>
<div class="info">222</div>
<div class="info">333</div>
<br>
<input type="button" value="search" onclick="search();">
 
<script>

if (!document.getElementsByClassName) {
  document.getElementsByClassName = function(search) {
    var d = document, elements, pattern, i, results = [];
    if (d.querySelectorAll) { // IE8
      return d.querySelectorAll("." + search);
    }
    if (d.evaluate) { // IE6, IE7
      pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
      elements = d.evaluate(pattern, d, null, 0, null);
      while ((i = elements.iterateNext())) {
        results.push(i);
      }
    } else {
      elements = d.getElementsByTagName("*");
      pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
      for (i = 0; i < elements.length; i++) {
        if ( pattern.test(elements[i].className) ) {
          results.push(elements[i]);
        }
      }
    }
    return results;
  }
}

function search() {
 
    var elements = document.getElementsByClassName('info');
    var contents = [];
    for (var i=0; i < elements.length; i++) {
        contents[i] = elements[i].innerText || elements[i].textContent || '';
    }
    var result = contents.join(' - ');
    
    alert( result );

}
</script>
</body>
 
</html>

рони 01.02.2013 08:06

Цитата:

Сообщение от lamer
У меня находит только содержимое первого класса:

а зачем break; в 36 строке???

рони 01.02.2013 08:13

lamer,
<html>

<head>
</head>

<body>
<div class="info">111</div>
<div class="info">222</div>
<div class="info">333</div>
<br>
<input type="button" value="search" onclick="search();">

<script>
function search() {
	getElementsByClass = function(classList, node) {
		var node = node || document,
		list = node.getElementsByTagName('*'),
		length = list.length,
		classArray = classList.split(/\s+/),
		classes = classArray.length,
		result = [], i,j
		for(i = 0; i < length; i++) {
			for(j = 0; j < classes; j++)  {
				if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
					result.push(list[i])
					break
				}
			}
		}
		return result
	}

var elements = getElementsByClass('info');
for (i=0; i < elements.length; i++) {

		elements[i]=elements[i].textContent || elements[i].innerText || "";

}

alert(elements.join(' - '))
}
</script>
</body>

</html>

danik.js 01.02.2013 08:14

рони, гениально! Совершенно иной подход, я даже догадаться не мог. Научишь? :dance:

рони 01.02.2013 08:47

danik.js,
Цитата:

Ученого учить — только портить
:agree:

melky 01.02.2013 16:14

Цитата:

Сообщение от рони
list[i].className.search('\\b' + classArray[j] + '\\b') != -1

ещё бывает такое :
(" " + list[i].className + " ").indexOf( " " + classArray[j] + " " );

интересно, что лучше ?)

lamer 01.02.2013 20:08

danik.js, спасибо я понял свою ошибку.

Встал вопрос, немного по другому, как записать чтоб в результате была выдача такая:
1 - 1
2 - 2
3 - 3


<html>
 
<head>
</head>
 
<body>
<div class="infoOne">1</div>
<div class="infoTwo">1</div>

<div class="infoOne">2</div>
<div class="infoTwo">2</div>

<div class="infoOne">3</div>
<div class="infoTwo">3</div>

<br>
<input type="button" value="search" onclick="search();">
 
<script>

if (!document.getElementsByClassName) {
  document.getElementsByClassName = function(search) {
    var d = document, elements, pattern, i, results = [];
    if (d.querySelectorAll) { // IE8
      return d.querySelectorAll("." + search);
    }
    if (d.evaluate) { // IE6, IE7
      pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
      elements = d.evaluate(pattern, d, null, 0, null);
      while ((i = elements.iterateNext())) {
        results.push(i);
      }
    } else {
      elements = d.getElementsByTagName("*");
      pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
      for (i = 0; i < elements.length; i++) {
        if ( pattern.test(elements[i].className) ) {
          results.push(elements[i]);
        }
      }
    }
    return results;
  }
}

function search() {
 
    var infoOne = document.getElementsByClassName('infoOne');
    var infoTwo = document.getElementsByClassName('infoTwo');
    var contentsOne = [];
    var contentsTwo = [];
    for (var i=0; i < infoOne.length; i++) {
        contentsOne[i] = infoOne[i].innerText || infoOne[i].textContent || '';
    }
    for (var i=0; i < infoTwo.length; i++) {
        contentsTwo[i] = infoTwo[i].innerText || infoTwo[i].textContent || '';
    }

    var result = contentsOne.join(' - ') + '\n' + contentsTwo.join(' - ');
    
    alert( result );

}
</script>
</body>
 
</html>

danik.js 01.02.2013 20:20

function search() {
  
    var infoOne = document.getElementsByClassName('infoOne');
    var infoTwo = document.getElementsByClassName('infoTwo');
    var contents = [];
    for (var i=0; i < infoOne.length; i++) {
        contents[i] = [infoOne[i].innerText || infoOne[i].textContent || '', infoTwo[i].innerText || infoTwo[i].textContent || ''].join(' - ');
    }
 
    var result = contents.join('\n'); // для html - join('<br/>')
     
    alert( result );
 
}

lamer 01.02.2013 23:18

danik.js, спасибо очень помогли.

devote 02.02.2013 03:02

Цитата:

Сообщение от melky
интересно, что лучше ?)

однозначно быстрее работает вариант с indexOf

danik.js 02.02.2013 03:12

Цитата:

Сообщение от devote
однозначно быстрее работает вариант с indexOf

Да, причем на порядок больше (тестил в хроме)


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