Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как задать порядок нахождения querySelectorAll (https://javascript.ru/forum/misc/75627-kak-zadat-poryadok-nakhozhdeniya-queryselectorall.html)

pokk 25.10.2018 17:16

как задать порядок нахождения querySelectorAll
 
Подскажите как сделать, в общем приходит JSON ответ от сервера с данными и эти данные распихиваются по полям input, select и.тд
для каждого ключа в JSNO сделал обработчик, с действием
"Item1": {
		selector: "#id_1",
		action: function(element, data, index){Get_Multi(element, data, index)}
	},

Соответственно и для массива тоже
"CH1": {
		selector: "#Id_1,#Id_2,#id_3",
		action: function(element, data, index){ Get_Multi(element, data, index)}
	},

вызов этого всего выглядит так
[].forEach.call(document.querySelectorAll(handler.selector),function(element) {
			handler.action(element, json[key], elementIndex++);
		}


И все это работало, пока мне не понадобилось сделать кнопку которая меняет местами элементы с Id_1,Id_2
после этого querySelectorAll находит все по порядку, а так как JSNO запрос неизменяемый, то присваивание данных элементам путаются.

Как можно задать порядок поиска или как можно по другому сделать ?
кнопка очень нужна.

Dilettante_Pro 25.10.2018 18:26

Исходный набор - перебирается правильно
<div id="id_1">Див 1</div>
<div id="id_2">Див 2</div>

<script>
[].forEach.call(document.querySelectorAll("#id_1,#id_2"), function(elem,i)  {
    elem.innerText = elem.innerText + (i+1);
});
</script>

Переставленный - перебирается НЕправильно
<div id="id_2">Див 2</div>
<div id="id_1">Див 1</div>

<script>
[].forEach.call(document.querySelectorAll("#id_1,#id_2"), function(elem,i)  {
    elem.innerText = elem.innerText + (i+1);
});
</script>


Переставленный с сортировкой - перебирается правильно

<div id="id_2">Див 2</div>
<div id="id_1">Див 1</div>

<script>
Array.from(document.querySelectorAll("#id_1,#id_2")).sort(function (a, b) {
  if (a.id > b.id) {
    return 1;
  }
  if (a.id < b.id) {
    return -1;
  }
  return 0;
}).forEach( function(elem,i)  {
    elem.innerText = elem.innerText + (i+1);
});
</script>

Alexandroppolus 25.10.2018 20:15

в первом приближении можно так:
handler.selector.split(/\s*,\s*/).forEach(function(sel, i)  {
    var elem = document.querySelector(sel);
    ....
});

Aetae 25.10.2018 20:23

Alexandroppolus, пока не вылезут всякие :not да :any.)
pokk, переписывай handler.action, он не должен быть привязан ни к какому чудесному index, только самому элементу и его свойствам.

Alexandroppolus 25.10.2018 23:39

Цитата:

Сообщение от Aetae
Alexandroppolus, пока не вылезут всякие :not да :any.)

:not пока что только простые единичные селекторы держит. А что за :any?

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

Aetae 26.10.2018 00:16

https://developer.mozilla.org/ru/docs/Web/CSS/:any
Удобно чтобы превратить всё в ад.)

pokk 26.10.2018 05:22

Dilettante_Pro, А как сортировка работает ? хоть я и прочитал про функцию sort, пока не допер как она сортирует, дело в том что у меня id всякие могут быть не с одинаковым префиксом а вот с индексом (_1) одинаковым к примеру такие (#Id_dmx_2,#Id_univ_2,#id_Dmx_ON_OFF_2)
причем сортируются правильно как указал выше в том же порядке.
Aetae, т.е добавить ещё цикл внутри [].forEach.call который перебирает id по handler.selector, и там уже запускается Act без индекса ?

2) Кстати, как суда добавить разбор двух мерного массива JSON
3) В будущем хочу сделать что по данным от JSON ответа, будет строиться вся таблица и сразу заполняться поля
так вот хотел сделать как:
"Table": {
		selector: "#id_1",
		action: function(element, data, index){MakeTable();}
	},

Но тут как внутри MakeTable получить другие значения? Походу это надо будет сделать совсем по другому.

Dilettante_Pro 26.10.2018 10:24

Цитата:

Сообщение от pokk
А как сортировка работает ?

Обычная сортировка по символьным строкам
alert(["Id_univ_2","id_Dmx_ON_OFF_2","Id_dmx_2"].sort(function (a, b) {
  if (a > b) {
    return 1;
  }
  if (a < b) {
    return -1;
  }
  return 0;
}));


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

pokk 26.10.2018 12:06

Цитата:

Сообщение от Dilettante_Pro (Сообщение 497057)
Обычная сортировка по символьным строкам

А можно по подробнее или ссылку, посимвольно каждую букву в строки сравниваться и аски код буквы ?
"Соответственно, вы должны знать порядок сортировки по индексам"
Цитата:

Сообщение от Dilettante_Pro (Сообщение 497057)
Соответственно, вы должны знать порядок сортировки по индексам, чтобы знать, какой div с каким id будет первым и

Какой индекс ?

Dilettante_Pro 26.10.2018 17:43

pokk,
Сорри, id

Описание sort()


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