1 / 1 / 0
Регистрация: 19.04.2021
Сообщений: 44
|
||||||
1 | ||||||
Элементы возвращаются неправильно12.07.2023, 20:11. Показов 802. Ответов 18
Метки нет (Все метки)
Мне нужна ваша помощь. Моя задача состоит в том, чтобы создать 100 div с помощью чистого JavaScript. Каждый div должен обладать следующей функциональностью: Каждый div имеет свое название, типа div1, div2, div3 и до 100. Предположим, зову я на 31, 45, 89, они перемещаюсь наверх. Теперь элементы у меня становятся
div89, div45, div31, div1, div2 и на месте тех, которые я забрал, идут: div30 - div32 - div33, div43 -div44 - div46 div88 – div90 – div91 Когда я щелкаю еще раз на поднявшиеся наверх элементы, они должны вернуться на предыдущие позиции. Проблема заключается в том, что они возвращаюсь назад, но в произвольные места списка (иногда нормально, иногда нет) и список у меня не выглядит поочередно. Где моя ошибка? Спасибо вам большое
1
|
12.07.2023, 20:11 | |
Ответы с готовыми решениями:
18
ASP.Core: не возвращаются элементы getElementsByClassName() == [0] Элементы неправильно заносятся в список Неправильно меняет элементы на нули Неправильно удаляются элементы стека функция неправильно считает элементы |
молодой
|
|
12.07.2023, 22:06 | 2 |
Потому что ты работаешь с индексами массива
Пример 1 2 3 4 5 6 допустим мы переместили вперед 6 5 4, т.е. сначала 6 потом 5 потом 4 4 5 6 1 2 3 Для красоты демонстрации я считаю позиции/индекс элемента в массиве originalPositions не снуля как у тебя в коде а с 1, т.е. во второй строке это позиция а в первой значение 6 вернули на место 4 5 1 2 3 6 - значения 1 2 3 4 5 6 - индексы 4 вернули 5 1 2 4 3 6 - значения 1 2 3 4 5 6 - индексы 5 вернули 1 2 4 3 5 6 - значения 1 2 3 4 5 6 - индексы итого после всех возвратов получили 1 2 4 3 5 6 вместо 1 2 3 4 5 6 нужно перемещать элементы сравнивая значения, а не инндексы, ты только что продемострировал проблемы которую решает key в react
1
|
1 / 1 / 0
Регистрация: 19.04.2021
Сообщений: 44
|
|
12.07.2023, 22:24 [ТС] | 3 |
Спасибо большое, однако я это задача для чистого js. Можете помочь мне это исправить? Буду очень благодарен
0
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
||||||
13.07.2023, 00:36 | 4 | |||||
До этого я ещё не дочитал...
0
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
||||||
13.07.2023, 20:50 | 5 | |||||
Дочитал...
Halland, задача в таком виде нерешаема, т.к. нет критерия очерёдности повторных кликов. Вот эта твоя фраза... Замечательно. Теперь давай определись, где эта предыдущая позиция? Какбэ всё говорит о том, что это его стартовая, индексная позиция в коллекции. Допустим поставили элемент на своё место. А если ты нащёлкал перед этим кучу других элементов в рандомном порядке и они поднялись наверх, то при повторном клике они сдвинут элемент, ранее поставленный на место, и он в итоге окажется не на своём месте. Если тебя устроит вот такое, то держи ... поклацай, подумай
0
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
|||||||||||
13.07.2023, 23:16 | 6 | ||||||||||
Суть в том, что при первом клике идёт запись в атрибут оригинальной позиции, и добавляется класс selected (можно и без него). А при повторном клике, идёт перемещение на обратную позицию из атрибута. Ничего сложного Добавлено через 4 минуты А я понял в чём проблема
0
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
|
13.07.2023, 23:53 | 7 |
0
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
|
13.07.2023, 23:58 | 8 |
Проблема задачи состоит в том, что при выборе несколько значений. Остальные div сдвинулись. И ранее записанная индексация, уже не будет верна по отношению к другим. Неважно каким образом была записана другая позиция.
0
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
|
14.07.2023, 00:36 | 9 |
угу
уже лучше да ... причём, если искать элементы по значению, чтобы правильно вставить event.target , то тоже получим баг, только с другим алгоритмом, нежели баг с индексами
0
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
||||||
14.07.2023, 00:45 | 10 | |||||
Можно немного по другому решить задачу, всё таки сделать начальную метку. А потом бегать, и искать от куда родом данный div
1
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
||||||
14.07.2023, 01:48 | 11 | |||||
ну да, по-другому можно...
1
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
|
14.07.2023, 02:46 | 12 |
Да, тоже неплохой вариант, создать span невидимый. И потом возвращать оригинальную тушку на место его
0
|
молодой
|
|
14.07.2023, 11:33 | 13 |
я уверен что этот "хрен" должен справиться, так, как если бы проверялись значения, а именно последовательность цифр в div.innerText, которая по условию должна быть отсортирована по возрастанию, и таким образом ты не вставишь 4 перед 3, если правильно напишешь проход(поиск места вставки) и вставку. Сложность задачи от O(1) до O(logN), можно считать число перемещенных элементов в начало списка, тогда оставшиеся это отсортированный массив с пропусками, в котором для поиска места вставки предлагаю использовать используем бинарный поиск.
0
|
3498 / 1262 / 428
Регистрация: 24.07.2016
Сообщений: 1,888
|
|
15.07.2023, 01:07 | 14 |
Пример с innerText (значение)
Код
1 2 3 4 5 6 имеем на выхлопе... Код
4 3 2 1 5 6 То есть, жмём на 3 и элемент перемещается под двойку... У нас ведь нет чёткого критерия последовательности, какой элемент возвращать на место, так что рандомно жмём тройку... Код
4 2 3 1 5 6 Код
4 3 1 2 5 6 Код
3 4 1 2 5 6
1
|
молодой
|
|
15.07.2023, 01:53 | 15 |
klyapa, спасибо тебе за ответ, я извиняюсь за неясное толкование своего решения попробую объяснить, правильная последовательность после клику по 3 будет
4 2 1 3 5 6 "можно" лучше заменить на "нужно", т.е. место вставки будет только в тот набор который не участвовал в перемещении(оставшиеся это отсортированный массив), т.е. первая цифра, которая не перемещалась в данном случае 1, и с нее начнется поиск места вставки. после этого у нас будет снова два массива, массивы условно разделены пременной счетчиком который будет равен 2 (до клика по 3 был равен 3), на самом деле это один массив точнее HTMLCollection 4 2(отсюда можно брать и сюда можно перемещать новые элементы) и 1 3 5 6 (тут ищем место вставки и вставляем)
0
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
||||||
15.07.2023, 11:01 | 16 | |||||
Более правильная реализация, с данным алгоритмом
0
|
молодой
|
|
15.07.2023, 12:59 | 17 |
не хочу спорить на счет правильно не правильно, просто потому что кто - то это сказал...
у тебя тоже есть подсчет перемещенных/выбранных(selected) элементов, только другим способом...
0
|
89 / 74 / 24
Регистрация: 16.05.2023
Сообщений: 268
|
|
15.07.2023, 15:47 | 18 |
Я написал что - более правильная.
Логика сказала - Данный код отлично решает задачу перемещения выбранного элемента наверх или вниз. В данном случае, код использует цикл for, чтобы найти правильное место для перемещения выбранного элемента. В цикле проходится по каждому дочернему элементу контейнера и проверяет условие: если текущий элемент не содержит класс "selected" (то есть не является выбранным) и его оригинальная позиция (originalPos) больше или равна оригинальной позиции выбранного элемента, то запоминается индекс этого элемента в переменную MoveIndex. После завершения цикла, выбранный элемент перемещается перед элементом с индексом MoveIndex с помощью container.insertBefore(). Затем выбранный элементу удаляется класс "selected", чтобы он больше не считался выбранным. Если элемент не является выбранным, то он просто перемещается в начало контейнера с помощью container.insertBefore() и добавляется класс "selected". Таким образом, этот код эффективно перемещает выбранный элемент наверх или вниз, основываясь на его оригинальной позиции и манипулируя DOM. Приведи рабочий пример и ты
0
|
молодой
|
||||||
18.07.2023, 13:28 | 19 | |||||
я придумал альтернативное решение
0
|
18.07.2023, 13:28 | |
18.07.2023, 13:28 | |
Помогаю со студенческими работами здесь
19
Неправильно считает элементы матрицы Консоль неправильно выводит элементы массива Неправильно выводит элементы массива в textbox Неправильно выводит на экран элементы структуры Отладчик отображает поля структур и элементы массивов неправильно Не возвращаются фото из БД Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |