Я хочу реализовать такое:
Я добавляю задачу(элемент с классом .task
и атрибутом data-id
) через input, а потом информация сохраняется в localStorage
Я код написал таким образом, что атрибуту data-id
задаётся просто кол-во элементов с классом .task
Я хочу сделать так: например, на сайте есть элементы с атрибутами 1,2,3,4,5. Я удалил элементы 2,3. На сайте остались элементы: 1,4,5. При добавлении нового элемента атрибут надо сравнить с тем, что есть на сайте и от самого минимального добавить. В данном случае мой алгорит должен пойти таким образом: 1 есть, такой атрибут не добавлять, 2 нету, значит можно создать элемент с таким атрибутом. Если добавить ещё элемент, то у него будет data-id
3, а потом уже создастся 6, так как 4 и 5 уже есть.
Собственно я не могу понять как такой алгоритм мне написать, подскажите пожалуйста.
Я над этим парюсь, чтобы добавлять элементы в localStorage по ключам, которые будут равны data-id
, возможно есть какое-то решение получше, чем выставление элементам id
Вот код, который добавляет в глобальный массив arr
элементы, но я не понимаю как правильно задать условия, чтобы в массив добавлялись data-id
только один раз, которые неравны друг другу. Мне массив нужен для того, чтобы сравнить его элементы по значениям и добавить тот data-id
, которого нету
for (let i = 0; i < task.length; i++) {
for (let j = 0; j < task.length; j++) {
if (task[i].getAttribute('data-id') ==
task[j].getAttribute('data-id')) {
arr.push(task[i].getAttribute('data-id'));
}
}
}
block.setAttribute('data-id', task.length);
let task, tasks, task__close;
let add__button = document.querySelector('.add__button');
let add__input = document.querySelector('.add__input');
let arr = [];
function addElem() {
if (add__input.value === '') {
return false;
}
let block = document.createElement('div');
let taskId;
tasks = document.querySelector('.tasks');
task = document.querySelectorAll('.task');
block.className = 'task';
for (let i = 0; i < task.length; i++) {
for (let j = 0; j < task.length; j++) {
if (task[i].getAttribute('data-id') ==
task[j].getAttribute('data-id')) {
arr.push(task[i].getAttribute('data-id'));
}
}
}
block.setAttribute('data-id', task.length);
block.innerHTML = '<div class="task__close"></div>';
block.innerHTML += add__input.value;
tasks.prepend(block);
task__close = document.querySelector('.task__close');
add__input.value = '';
startClose();
} // function addElem()
function startClose() {
task__close = document.querySelectorAll('.task__close');
for (let i = 0; i < task__close.length; i++) {
task__close[i].addEventListener('click', (event) => {
event.path[1].remove();
});
}
} // function startClose()
add__button.addEventListener('click', () => {
addElem();
});
add__input.addEventListener('keydown', (event) => {
if (event.code == 'Enter' || event.keyCode == '13' || event.key == 'Enter') {
addElem();
}
});
startClose();
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap');
*, *:before, *:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html{
scroll-behavior: smooth;
}
body {
margin: 0;
padding: 0;
font-size: 16px;
font-family: 'Open Sans', sans-serif;
color: black;
}
h1, h2, h3, h4, h5, h6, ul {
margin: 0;
}
ul {
list-style: none;
}
img {
display: block;
max-width: 100%;
height: auto;
}
.container {
max-width: 1100px;
width: 100%;
margin: 0 auto;
}
.container.fluid {
max-width: 100%;
}
.spheres {
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
}
.sphere {
border-right: 1px solid black;
flex-grow: 1;
padding: 15px 0;
}
.sphere:first-child {
border-left: 1px solid black;
}
.sphere .svg__icon {
max-width: 70px;
margin: 0 auto;
}
.sphere .svg__icon img {
width: 100%;
}
.sphere__title {
text-align: center;
margin-top: 10px;
font-size: 20px;
}
.add {
background-color: #46a049;
padding: 25px 0;
}
.add__title {
font-size: 22px;
text-align: center;
color: white;
}
.add__input-wrapper {
position: relative;
max-width: 500px;
margin: 10px auto 0;
padding: 0 15px;
}
.add__input {
outline: 0;
font-family: inherit;
font-size: inherit;
border: 1px solid white;
display: block;
border-radius: 5px;
padding: 7px 55px 7px 20px;
width: 100%;
}
.add__button {
position: absolute;
top: 50%;
right:15px;
transform: translate(0, -50%);
width: 50px;
height: 50px;
}
.add__button:before {
position: absolute;
display: block;
content: '';
top: 50%;
transform: translate(-40%, -50%) rotate(90deg);
width: 2px;
background-color: #91a8c4;
height: 20px;
right: 40%;
}
.add__button:after {
position: absolute;
display: block;
content: '';
top: 50%;
transform: translate(-40%, -50%);
width: 2px;
background-color: #91a8c4;
height: 20px;
right: 40%;
}
.add__button:hover {
cursor: pointer;
}
.add__button:hover:before {
background-color: #3675bc;
}
.add__button:hover:after {
background-color: #3675bc;
}
.tasks {
margin-top: 20px;
padding: 0 20px;
}
.task {
position: relative;
border-bottom: 2px solid #f0f0f0;
padding: 10px 0;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
}
.task__close {
width: 20px;
height: 20px;
border: 1px solid gray;
border-radius: 50%;
margin-right: 15.5px;
position: relative;
}
.task__close:before {
position: absolute;
display: block;
content: '';
right: 6px;
top: 3px;
transform: rotate(45deg);
width: 5px;
height: 10px;
border-bottom: 1px solid rgba(128,128,128,0.8);
border-right: 1px solid rgba(128,128,128,0.8);
opacity: 0;
transition: .2s linear opacity;
}
.task__close:hover {
background-color: rgba(128,128,128,0.2);
cursor: pointer;
}
.task__close:hover:before {
opacity: 1;
}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Document</title>
</head>
<body>
<section class="section">
<div class="container">
<div class="spheres">
<div class="sphere health">
<div class="svg__icon">
<img src="https://image.flaticon.com/icons/svg/148/148838.svg" alt="">
</div>
<div class="sphere__title">
Здоровье
</div>
</div>
<div class="sphere intelligence">
<div class="svg__icon">
<img src="https://image.flaticon.com/icons/svg/1491/1491214.svg" alt="">
</div>
<div class="sphere__title">
Развитие
</div>
</div>
<div class="sphere sociality">
<div class="svg__icon">
<img src="https://image.flaticon.com/icons/svg/1078/1078011.svg" alt="">
</div>
<div class="sphere__title">
Отношения
</div>
</div>
</div> <!-- .spheres -->
</div> <!-- .container -->
<div class="container fluid">
<div class="add">
<div class="add__title">
Добавить задачу
</div>
<div class="add__input-wrapper">
<input type="text" placeholder="Бег 1 км" class="add__input">
<div class="add__button"></div>
</div>
</div>
</div> <!-- .container.fluid -->
<div class="container">
<div class="tasks">
<div class="task" data-id="0">
<div class="task__close"></div>
Моя первая задача
</div>
</div>
</div> <!-- .container -->
</section>
</body>
</html>
var arr = [2,5,6];
function addNext(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] != i) {
arr.splice(i, 0, i);
return arr;
}
}
arr.push(arr.length);
return arr;
}
console.log(JSON.stringify(arr));
console.log(JSON.stringify(addNext(arr)));
console.log(JSON.stringify(addNext(arr)));
console.log(JSON.stringify(addNext(arr)));
console.log(JSON.stringify(addNext(arr)));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Повторял проект с coursehunter о создании блога на Nuxt + Laravel APIфронт и бэк были на разных доменах