Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Получить элементы внутри блока по порядку и присвоить свое значение (https://javascript.ru/forum/dom-window/70834-poluchit-ehlementy-vnutri-bloka-po-poryadku-i-prisvoit-svoe-znachenie.html)

Янковиц 05.10.2017 19:21

Получить элементы внутри блока по порядку и присвоить свое значение
 
Добрый день. Есть следующий кусок html:
<div class="task-list">
	<div id="task-1" class="task" data-name="category">
		<p>Категории</p>
		<a href="#" class="icon-pencil">✎</a>
	</div>
	<div id="task-2" class="task" data-name="size">
		<p>Размер</p>
		<a href="#" class="icon-pencil">✎</a>
	</div>
	<div id="task-3" class="task" data-name="color">
		<p>Цвет</p>
		<a href="#" class="icon-pencil">✎</a>
	</div>
	<div id="task-4" class="task" data-name="brend">
		<p>Производитель</p>
		<a href="#" class="icon-pencil">✎</a>
	</div>
</div>


Как последовательно получить data-name всех дивов внутри task-list и присвоить им значения? Например, должно получиться:
category:10,size:20,color:30,brend:40
Спасибо

laimas 05.10.2017 19:38

$(function() {
    $('[data-name]').each(function() {
        var attr = this.getAttribute('data-name') + ':30';
        this.setAttribute('data-name', attr)
    });
});

Янковиц 05.10.2017 19:43

Спасибо. Правда, я наверно не очень правильно выразил мысль. Мне нужно не изменить data-name, а просто, получить весь список и передать в переменную. В итоге моя переменная на выходе должна содержать category:10,size:20,color:30,brend:40 Чтобы потом обработать через ajax, или есть более элегантное решение?

Rasy 05.10.2017 19:45

Янковиц,
Некоторые спешат, невнимательно читают условие... Вот верный вариант. :)

$('[data-name]').attr('data-name', function(i, v) {
   return v+=':'+(++i*10);
});

Янковиц 05.10.2017 19:49

Не совсем понял как загнать в переменную... Простите, мозк не соображает, а работу делать надо ;)

laimas 05.10.2017 19:49

Цитата:

Сообщение от Янковиц
В итоге моя переменная на выходе должна содержать category:10,size:20,color:30,brend:40

Все понятно вы пишите, только не поясняете зависимости 10, 20, ... со значением атрибутов, что догадываться изволите?

Rasy 05.10.2017 19:50

Цитата:

Сообщение от Янковиц
В итоге моя переменная на выходе должна содержать category:10,size:20,color:30,brend:40 Чтобы потом обработать через ajax, или есть более элегантное решение?

Тогда, да
var str = $('[data-name]').attr('data-name', function(i, v) {
   return v+=':'+(++i*10);
}).map(function(indx, el) {
  return $(el).data('name');
}).get().join(',');

Янковиц 05.10.2017 19:53

Цитата:

Сообщение от laimas (Сообщение 466669)
Все понятно вы пишите, только не поясняете зависимости 10, 20, ... со значением атрибутов, что догадываться изволите?

Простите.. Если первый div, то data-name присвоить 10, если второй, то 20 и так далее. Заведомо не известно, див с каким data-name будет первым, а какой последующий не известно...

Янковиц 05.10.2017 19:54

var str = $('[data-name]').attr('data-name', function(i, v) {
   return v+=':'+(++i*10);
}).map(function(indx, el) {
  return $(el).data('name');
}).get().join(',');


Не совсем понимаю, где здесь переменная

Rasy 05.10.2017 19:55

Янковиц,
снизу - alert(str);

laimas 05.10.2017 19:55

Rasy,
очень внимательно читаете, но как гончая ... Зачем же один цикл на изменение, затем второй на объединение, если можно сразу к коллекции $.map($('[data-name]'), function(...).join(',')? И .get() здесь и нафик не нужен.

Rasy 05.10.2017 20:02

laimas,
С утилитой map лучше, но автор сразу не правильно сформулировал задачу и такой вариант не кто не смог бы родить.

laimas 05.10.2017 20:03

Янковиц,
если 10 и прочее к действительно к индексу привязано, а на выходе строка, то все намного проще, чем советуют:

var s = $.map($('[data-name]'), function(e, i) {
        return e.getAttribute('data-name') + ':' + ++i * 10
}).join(',');

Янковиц 05.10.2017 20:03

Цитата:

Сообщение от Rasy (Сообщение 466673)
Янковиц,
снизу - alert(str);

У меня два блока с идентичным содержанием, как конкретизировать, из какого блока считывать data-name?

laimas 05.10.2017 20:04

Цитата:

Сообщение от Rasy
но автор сразу не правильно сформулировал задачу

Даже так? А я значит экстрасенс?

Rasy 05.10.2017 20:07

Цитата:

Сообщение от laimas
Даже так? А я значит экстрасенс?

Я про первый пост до уточнений. Думаю не экстрасенс.

Янковиц 05.10.2017 20:11

И еще один момент. Вообще, это часть drag and drop системы.
Хватаю из одного блока, и перемещаю в другой. При тестировании, я динамически меняю количество div. Код предложенный в топике повесил на клик кнопки. Однако в alert выводит список с data-name элементов при загрузки страницы, но не фиксирует при динамическое изменение... Как это решить? И еще, данные берет из первого блока а не из второго...

laimas 05.10.2017 20:12

Цитата:

Сообщение от Янковиц
У меня два блока с идентичным содержанием, как конкретизировать

Либо первый, либо последний, выбирайте какой нужен:

var s = $.map($('[data-name]').first(), function(e, i) {...
//или
var s = $.map($('[data-name]').last(), function(e, i) {...

laimas 05.10.2017 20:14

Цитата:

Сообщение от Янковиц
Однако в alert выводит список с data-name элементов при загрузки страницы, но не фиксирует при динамическое изменение...

Для этого существует делегирование, либо данный обработчик добавляется динамически после добавления новых элементов.

Янковиц 05.10.2017 20:17

Цитата:

Сообщение от laimas (Сообщение 466682)
Для этого существует делегирование, либо данный обработчик добавляется динамически после добавления новых элементов.

Делегирование это через on?
Типа такого??:
$('body').on('click', '.save-filter', function(){
		var str = $.map($('[data-name]').last(), function(e, i) {
			return e.getAttribute('data-name') + ':' + ++i * 10
		}).join(',');
		alert(str);
	});

Янковиц 05.10.2017 20:18

Не может быть проблемы в этом? Событие находится внутри $(document).ready(function(){

Rasy 05.10.2017 20:23

Цитата:

Сообщение от laimas
var s = $.map($('[data-name]').first(), function(e, i) {...
//или
var s = $.map($('[data-name]').last(), function(e, i) {...

Тут уже тоже перебор с кодом для одного объекта...

Янковиц 05.10.2017 20:25

Все, разобрался. Работает. Спасибо большое. Да, немного затупил...

laimas 05.10.2017 20:42

Цитата:

Сообщение от Янковиц
Делегирование это через on?

Да, но только делегировать обработку выгоднее самому ближайшему родителю если такой есть, а не body.

laimas 05.10.2017 20:44

Цитата:

Сообщение от Rasy
Тут уже тоже перебор с кодом для одного объекта...

Это не перебор, а ошибка, должен указан родитель первый/последний, а потом его детишки.

laimas 05.10.2017 20:48

Янковиц,
вот так должно быть

var str = $.map($('div.task-list').last().children('div'), function(e, i) {

Rasy 05.10.2017 20:53

Цитата:

Сообщение от laimas
а ошибка

Все из-за спешки.:)

laimas 05.10.2017 21:12

Цитата:

Сообщение от Rasy
Все из-за спешки.

Скорее на автомате, кто родитель, кто дети ..., если бы не было замечания даже бы и не екнуло.


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