Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.09.2017, 22:02
Профессор
Отправить личное сообщение для dima85 Посмотреть профиль Найти все сообщения от dima85
 
Регистрация: 14.03.2010
Сообщений: 194

Собрать данные из html
Есть такой html блок, при необходимости его можно подкорректировать
<div id="blocks">
<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13"><br>
<label><input type="checkbox"> text3</label><br>
<label><input checked="" type="checkbox"> text4</label><input value="text"><br>
<label><input type="checkbox"> text15</label><input value="10"><br>
</div>


Нужно в textarea собрать данные этого блока, вот так:
Код:
1 text1 20 13
text3
1 text4 text
text15 10
Если на checkbox есть галочка то добавляем "1" в начало строки. input полей может быть до 3.

Подскажите пожалуйста как лучше и проще это сделать.
Ответить с цитированием
  #2 (permalink)  
Старый 07.09.2017, 23:10
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<div id="blocks">
<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13"><br>
<label><input type="checkbox"> text3</label><br>
<label><input checked="" type="checkbox"> text4</label><input value="text"><br>
<label><input type="checkbox"> text15</label><input value="10"><br>
</div>
<textarea cols="30" rows="10"></textarea>
<script>
	var inp = document.querySelectorAll('input');
	var label = document.querySelectorAll('label');
function ss(){
	document.querySelector('textarea').value = +inp[0].checked+''+label[0].textContent+' '+inp[1].value+' '+inp[2].value+'\n'+(+inp[3].checked)+''+label[1].textContent+'\n'+(+inp[4].checked)+''+''+label[2].textContent+' '+inp[5].value+'\n'+(+inp[6].checked)+''+label[3].textContent+' '+inp[7].value;
	}
	document.querySelector('#blocks').onchange=ss;
	ss();
</script>

Последний раз редактировалось j0hnik, 07.09.2017 в 23:17.
Ответить с цитированием
  #3 (permalink)  
Старый 07.09.2017, 23:22
Профессор
Отправить личное сообщение для dima85 Посмотреть профиль Найти все сообщения от dima85
 
Регистрация: 14.03.2010
Сообщений: 194

Этот блок, он динамический. Количество label может быть разным.
Может этот блок завернуть в form и потом симулировать нажатия на отправления в форму, и таким образом получать все данные?
Ответить с цитированием
  #4 (permalink)  
Старый 07.09.2017, 23:57
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<div id="blocks">
<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13"><br>
<label><input type="checkbox"> text3</label><br>
<label><input checked="" type="checkbox"> text4</label><input value="text"><br>
<label><input type="checkbox"> text15</label><input value="10"><br>
</div>
<textarea cols="30" rows="10"></textarea>
<script>
var area = document.querySelector('textarea');
[].forEach.call(document.querySelectorAll('#blocks>*'), function(el, i){
	if(el.matches('label')) {
		area.value +=i?'\n'+(+el.children[0].checked):+el.children[0].checked;
		area.value += el.textContent;
	}
	if(el.matches('input')) area.value += ' '+el.value;
});
</script>

Последний раз редактировалось j0hnik, 08.09.2017 в 02:04.
Ответить с цитированием
  #5 (permalink)  
Старый 08.09.2017, 10:01
Профессор
Отправить личное сообщение для dima85 Посмотреть профиль Найти все сообщения от dima85
 
Регистрация: 14.03.2010
Сообщений: 194

Последнее решение просто шикарное.
Но когда у нас в строчке только label, нет input вставляется 2 enter. То есть появляется пустая строчка.
Я пытаюсь ее убрать таким образом
area.value = area.value.replace(/\r\n\r\n/g, '\r\n');

Но почему-то не получается. Как это сделать?

Последний раз редактировалось dima85, 08.09.2017 в 10:07.
Ответить с цитированием
  #6 (permalink)  
Старый 08.09.2017, 10:22
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<div id="blocks">
<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13"><br>
<label><input type="checkbox"> text3</label><br>
<label><input checked="" type="checkbox"> text4</label><input value="text"><br>
<label><input type="checkbox"> text15</label><input value="10"><br>
</div>
<textarea cols="30" rows="10"></textarea>
<script>
var area = document.querySelector('textarea');
[].forEach.call(document.querySelector('#blocks').children, function(el, i){
	if(el.matches('label')) {
		area.value +=+el.children[0].checked;
		area.value += el.textContent;
	}
	if(el.matches('input')) area.value += ' '+el.value;
	if(el.matches('br')) area.value += '\n';
});
area.value = area.value.replace(/^\s+|\s+$/gm, '');
</script>

Последний раз редактировалось j0hnik, 08.09.2017 в 10:29.
Ответить с цитированием
  #7 (permalink)  
Старый 08.09.2017, 10:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,201

Сообщение от dima85
Есть такой html блок, при необходимости его можно подкорректировать
<div id="blocks">
<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13"><br>
<label><input type="checkbox"> text3</label><br>
<label><input checked="" type="checkbox"> text4</label><input value="text"><br>
<label><input type="checkbox"> text15</label><input value="10"><br>
</div>
Конечно его нужно поменять.
Вместо
<br>

делать "строки" нужно отдельными ДИВами

<div id="blocks">
	<div>
		<label><input checked="" type="checkbox"> text1</label><input value="20"><input value="13">
	</div>
	<div>
		<label><input type="checkbox"> text3</label>
	</div>
	<div>
		<label><input checked="" type="checkbox"> text4</label><input value="text">
	</div>
	<div>
		<label><input type="checkbox"> text15</label><input value="10">
	</div>
</div>

Такую конструкцию и обрабатывать будет удобнее...
Ответить с цитированием
  #8 (permalink)  
Старый 08.09.2017, 10:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,201

Сообщение от dima85
Может этот блок завернуть в form и потом симулировать нажатия на отправления в форму, и таким образом получать все данные?
Если дело в отправке данных - то так и нужно сделать.
Ответить с цитированием
  #9 (permalink)  
Старый 08.09.2017, 10:30
Профессор
Отправить личное сообщение для dima85 Посмотреть профиль Найти все сообщения от dima85
 
Регистрация: 14.03.2010
Сообщений: 194

Разобрался, помогло:
area.value = area.value.replace(/\n+/g,'\n');


ksa где вы раньше были, мы уже и так сделать
Ответить с цитированием
  #10 (permalink)  
Старый 08.09.2017, 10:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,201

Сообщение от dima85
мы уже и так сделать
Лучше сделать нормально, чем гоношить разные пришлепочки.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передавать данные из html? carder Общие вопросы Javascript 5 27.02.2016 19:46
Проблема получения объекта JSON espltd Элементы интерфейса 13 03.02.2016 14:55
Как лучше всего добавлять на страницу данные, пришедшие в json? ogurchik AJAX и COMET 7 08.10.2015 15:01
Преобразовать строку в HTML код (обратное htmlspecialchars из php) daslex Общие вопросы Javascript 71 23.08.2015 20:41
собрать из json Html Валерий1996 AJAX и COMET 1 15.06.2015 08:41