Я пытался сделать Список дел для обучения для PHP. Я использовал классы начальной загрузки: collapse и list-group. Каждый тег списка имеет 2 значка, которые служат для счетчиков.
Значок 1 = нет времени, когда я выучил или пересмотрел главу.
Значок 2 = нет времени Я фактически использовал концепцию из главы.
Когда я нажимаю на значки, их количество должно увеличиваться на единицу. Позже я добавлю опции для добавления новых глав и подразделов.
На данный момент я хочу сохранить значения значков в моем локальном хранилище для дальнейшего использования.
Когда я обновляю страницу, все значки должны быть обновлены с их текущими значениями.
Я уже знаю, как получать и извлекать данные из локального хранилища, но не знаю, как это реализовать в текущей ситуации.
var badges= document.querySelectorAll('.badge');
badges.forEach(function (e) {
e.addEventListener('click', incrementBadge);
});
function incrementBadge(e){
let num =Number(e.target.textContent)+1;
e.target.textContent=num;
}
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity = "sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin = "anonymous">
<div class = "container mt-5">
<div class = "row">
<div class = "col-lg-6">
<button class = "btn btn-block btn-info" data-toggle = "collapse" data-target = "#php">Php</button>
<div class = "collapse" id = "php">
<ul class = "list-group mt-0">
<li class = "list-group-item">Iteration
<span data-type = "revise"class = "badge badge-info float-right">4</span>
<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
</li>
<li class = "list-group-item">Selection
<span data-type = "revise" class = "badge badge-info float-right">0</span>
<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity = "sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin = "anonymous"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity = "sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin = "anonymous"></script>
Я уже знаю, как хранить и извлекать данные из локального хранилища. Моя проблема в том, что я не знаю, как однозначно идентифицировать значки для хранения и извлечения их значений позже и реализовать это в коде javascript.
Если вы запустите свой сниппет сейчас, что идентифицирует ваши две строки? Это лейблы Iteration
и Selection
, верно? Если вы не свяжете эти строки с числовым идентификатором, это ваш уникальный идентификатор прямо здесь. Следующий вопрос - как получить этот текстовый идентификатор из разметки в свой javascript. У вас есть идеи, как этого добиться? Если бы это был я, я бы начал с добавления этих строк в качестве атрибута где-нибудь в разметке. Как вы думаете, куда лучше всего пойти?
Сначала я попытался использовать заголовок главы и данные текущего списка для ключа данных, которые нужно сохранить, и я получил значение значка, по которому щелкают, с некоторым регулярным выражением. Спасибо, Джозеф, я думаю, у меня есть идея. Я буду использовать массив с названием главы (т.е. php), а числовой идентификатор строк будет использоваться в качестве индекса для массива. но я все еще не могу придумать, как определить, какие значки и их значения, сохранить их в паре ключ-значение и получить их позже
Отлично. Как определить значок. Вы уже знаете, какой из них был выбран при доступе к e.target
. Исходя из этого, вы уже получаете доступ к значению с помощью .textContent
, который работает. Вы можете использовать e.target.getAttribute('your-attribute-name')
. При этом вы можете разместить свой ключ для этого значения на самом значке с помощью <span class = "badge badge-info float-right" your-attribute-name = "whatever">
. Вы также можете получить доступ к родительскому атрибуту с помощью e.target.parentNode.getAttribute('whatever')
. Выбор за вами. Не могли бы вы обновить свой вопрос аналогичной логикой?
Я просто добавил идентификаторы для значков (потренироваться и пересмотреть) Оттуда, как мне перейти к получению их индивидуальных значений. key = php [индекс строки], значение = ??
id
- это атрибут, который вы можете использовать, но с ним нужно быть осторожным. Чтобы ваш HTML был действительным, они должны быть уникальными. В настоящее время ваши id
не уникальны. Кроме того, значение, которое вы им присвоили, является не столько уникальным идентификатором, сколько категорией. Я бы предложил заменить их с id = "revise"
и id = "practice"
на data-type = "revise"
и data-type = "practice"
соответственно. соглашение data-
не требуется, но более семантически корректно указывать префикс ваших настраиваемых атрибутов с помощью data-
.
Я понял вашу точку зрения, и оттуда, как мне продолжить в js для хранения значений значков. Какие-либо предложения. Я просто не могу правильно думать, лол.
Итак, теперь вы можете выбрать тип значка, но у вас все еще нет строки. Вы можете использовать тот же процесс для идентификации строк (например, <li class = "list-group-item" data-id = "selection">
). Из вашего javascript вы получаете доступ к этим значениям с помощью getAttribute
. Внутри атрибута click вы можете создать уникальный идентификатор (строка + тип), обратившись к e.target.parentNode.getAttribute('data-id')
и e.target.getAttribute('data-type')
. Оттуда вы можете объединить их в уникальную строку (например, "iteration.practice") или добавить их в объект javascript (например, [{id:"iteration",type:"practice"}]
).
Таким образом, используя приведенный выше пример, можно создать уникальную строку с помощью let key = e.target.parentNode.getAttribute('data-id') + '.' + e.target.getAttribute('data-type')
. Это будет ваш ключ, который вы будете использовать в своем локальном хранилище.
Спасибо за ваше предложение. Код теперь может храниться с парой ключ-значение, но другая проблема заключается в том, как получить значения из LS и отобразить их обратно на значки в соответствующих строках.
Верный. Какой формат вы выбрали для ключа локального хранилища?
ключ = e.target.parentNode.getAttribute ('data-id') + '.' + e.target.getAttribute ('тип данных'); например, iteration.practice = 3;
Теперь, когда вы создали базу кода, в которой хранятся данные, ваша проблема получения данных становится тривиальной. Вы уже перебираете значки, поэтому на этом же этапе вы можете легко установить значение на основе локального хранилища. Если ключ не существует в локальном хранилище, .getItem
вернет null
. Это позволяет вам установить значение по умолчанию, используя логический оператор ИЛИ. Ваш код "получения" может быть следующим:
let key = e.parentNode.getAttribute('data-id') + '.' + e.getAttribute('data-type');
e.textContent = localStorage.getItem(key) || 0;
StackOverflow помещает редактор фрагментов в песочницу, поэтому код локального хранилища в следующем фрагменте закомментирован. Однако вы можете увидеть это в действии в этой скрипке.
Есть и другие подходы, которые можно использовать для хранения этих значений. Это всего лишь элементарный подход, но, надеюсь, он поможет вам на пути к созданию полностью проработанного приложения.
var badges= document.querySelectorAll('.badge');
badges.forEach(function (e) {
let key = e.parentNode.getAttribute('data-id') + '.' + e.getAttribute('data-type');
//e.textContent = localStorage.getItem(key) || 0;
e.addEventListener('click', incrementBadge);
});
function incrementBadge(e){
let num =Number(e.target.textContent)+1;
let key = e.target.parentNode.getAttribute('data-id') + '.' + e.target.getAttribute('data-type');
//localStorage.setItem(key, num);
e.target.textContent=num;
}
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity = "sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin = "anonymous">
<div class = "container mt-5">
<div class = "row">
<div class = "col-lg-6">
<button class = "btn btn-block btn-info" data-toggle = "collapse" data-target = "#php">Php</button>
<div class = "collapse" id = "php">
<ul class = "list-group mt-0">
<li class = "list-group-item" data-id = "iteration">Iteration
<span data-type = "revise"class = "badge badge-info float-right">4</span>
<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
</li>
<li class = "list-group-item" data-id = "selection">Selection
<span data-type = "revise" class = "badge badge-info float-right">0</span>
<span data-type = "practice" class = "badge badge-success float-right mr-3">2</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<script src = "https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity = "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity = "sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin = "anonymous"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity = "sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin = "anonymous"></script>
Я ценю вашу огромную помощь. Я очень хорошо понял ваш код. В настоящее время я делаю другую версию кода с новыми функциями, такими как добавление нового элемента сворачивания и содержимого строки из javascript. Я буду держать вас в курсе.
@TechXpert Круто! Рад, что смог помочь. :)
Привет, Джозеф, я только что завершил финальную версию проекта и хочу, чтобы вы рассмотрели его: jsfiddle.net/yuvraj034c/pznjpb2c Однако локальное хранилище и значки и не увеличиваются на скрипте Js. Он отлично работает в моем текстовом редакторе: есть некоторые примечания, которые вам нужно запомнить: во-первых, при добавлении подразделов, напишите идентификатор главы, а затем *, а затем имя подраздела. Например, если вы хотите добавить циклы в php, напишите циклы php * в поле ввода для подразделов. Чтобы удалить подраздел: напишите php.loops (не *) в поле ввода удаления.
Если вы хотите удалить главу, введите главу в поле удаления и нажмите кнопку del. Затем откройте консоль и скопируйте предоставленный код, измените значение здесь на имя удаляемой главы (в данном случае php) и перезагрузите страницу.
Я хочу еще раз поблагодарить вас за помощь в разработке логики и кода для локального хранилища. Я бы никогда так не подумал. Это вторая или третья рабочая программа, которую я создал для личного пользования. Я все еще изучаю веб-разработку. Я знаю html / css / bootstrap / javascript до ajax (в настоящее время изучаю), базовый php и все. Можете ли вы дать мне несколько советов о том, что и как учить эффективно и быстро.
Сделать это несложно. Вы сами пробовали писать код? Вот документация. Ваша стратегия будет заключаться в настройке следующей логики: 1) назначить значения значка из локального хранилища при загрузке страницы для любых значений, которые установлены в локальном хранилище, и 2) записать в локальное хранилище в событии щелчка, чтобы обновить значение для щелкнул значок. Вероятно, самое сложное - решить, как однозначно идентифицировать значки при их хранении.