<div>
<p><input class="check" id="check-option-1" name="name" type="checkbox">
<label for="check-option-1"></label>
</p>
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
<div>
<p><input class="check" id="check-option-2" name="name" type="checkbox">
<label for="check-option-2"></label>
</p>
<p class="copy">2</p>
<p class="copy-2">2.1</p>
</div>
(function(){
let checkboxSelector = 'input.check',
groupWrapperSelector = 'div',
dataSelectors = ['.copy', '.copy-2'],
localStorageKey = 'savedItems',
modal = document.querySelector('.modal'),
list = JSON.parse(localStorage.getItem(localStorageKey)) || {}
if (Object.keys(list).length) {
for (let key in list) {
document.getElementById(key).checked = true
modal.innerHTML += list[key]
}
}
document.addEventListener('change', evt => {
if (evt.target.matches(checkboxSelector)) {
if (evt.target.checked) {
addToList(evt.target)
} else {
delete list[evt.target.id]
}
updateModal(list)
saveChanges(list)
}
})
function addToList(elem) {
list[elem.id] = ''
let wrapper = elem.closest(groupWrapperSelector)
dataSelectors.forEach(selector => {
list[elem.id] += wrapper.querySelector(selector).innerText
})
}
function updateModal() {
modal.innerHTML = Object.values(list).join('')
}
function saveChanges(list) {
localStorage.setItem(localStorageKey, JSON.stringify(list))
}
})()
0: {
id: id,
p: текст параграфа
},
check-option-1: "11.1"
check-option-2: "22.1"
Нужно в localStorage хранить не только значения, но и ключи
Примерно вот так:0: { id: id, p: текст параграфа },
<p><input class="check" id="check-option-1" name="name" type="checkbox"> <label for="check-option-1"></label> </p> <p class="copy">1</p> <p class="copy-2">1.1</p>
В text должно быть: 1 1.1
<p class="copy">1</p>
<p class="copy-2">1.1</p>
В text должно быть: 2 2.1
<p class="copy">2</p>
<p class="copy-2">2.1</p>
check-option-1: "1 1.1"
check-option-2: "2 2.1"
0: {
id: check-option-1,
text: 1 1.1
},
1: {
id: check-option-2,
text: 2 2.1
}
Только нужно вот так:0: { id: check-option-1, text: 1 1.1 }, 1: { id: check-option-2, text: 2 2.1 }
а вот эти 0: ... 1: ... откуда берутся?
сделал list массивом. Непонятно только как вы при таком подходе собираетесь сопоставлять чекбоксы нужным индексам. я уже спрашивал вас о логике их выбора:
<div class="item">
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
<div class="item">
<p class="copy">2</p>
<p class="copy-2">2.1</p>
</div>
<div>
<p><input class="check" id="check-option-1" name="name" type="checkbox">
<label for="check-option-1"></label>
</p>
<img src="путь к картинке" alt="">
<h4>Название</h4>
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
Логика такая - при нажатии на чекбокс, мне нужно заносить в localStorage id чекбокса и параграфов, которые находятся непосредственно после чекбокса
P.S. Я же смогу допустим сохранять картинку в localStorage ?
<img src="путь к картинке" alt="">
или путь к картинке
то да, если данные содержащие изображение то надо учитывать ограничения на хранение информации в localstorage/Ограничение размера хранимых данных (как выше было уже сказано, примерно 5 Мб). Это достаточно маленький лимит для приложений, которые должны хранить большой объём данных или нуждаются в возможности работы без подключения к интернету. взято отсюда
Получается мне нужно в объект добавить еще ключи и значения?
{"id":"id элемента": "p":"текст"}
. Вы вполне можете добавлять в этот объект любые ключи и значения, и они будут сохранятся в localstorage. function addToList(elem) {
let wrapper = elem.closest(groupWrapperSelector);
// теперь мы вставляем объект содержащий свойства id и p
// в свойство p вносим innerText из всех P найденых с помощью wrapper.querySelector(selector)
list.push({
id: elem.id,
html: wrapper.outerHTML
});
}
function updateModal(list) {
// тут я до сих пор не понимаю что вы хотите увидеть в модальном окне, поэтому пока такой вывод.
// если вам нужно чтото другое, вы вполне осилите переписать эту часть так как вам надо
// в итем лежит объект (смотри addToList), соответственно к его ключам id и p можно обращаться
modal.innerHTML = list.map(item=>{
return item.html;
}).join("<br/>");
}
[
{
id: "blablabla",
list: [
{
type: "p",
class: "classname1",
list: [
{
type: "text",
text: "2.1"
},
{
type: "img",
class: "какойто класс",
src: "/blabla.ru/picture.img"
}
]
}
]
},
{
id: ......
},
...
]
0: {
id: check-option-1,
image: 'тут хранить путь к картинке - [src="тут какая-та картинка"]',
text: 1 1.1
link: 'тут хранить атрибут ссылки - [href="тут какая-та ссылка"]'
},
,,,
и т.д.
function updateModal(list) {
for let key in obj {
}
0: {
id: check-option-1,
image: 'тут хранить путь к картинке - [src="тут какая-та картинка"]',
text: 1 1.1
link: 'тут хранить атрибут ссылки - [href="тут какая-та ссылка"]'
},
"check-option-1": {
image: 'тут хранить путь к картинке - [src="тут какая-та картинка"]',
text: 1 1.1
link: 'тут хранить атрибут ссылки - [href="тут какая-та ссылка"]'
},
0: {
id: check-option-1,
list: {
image: 'тут хранить путь к картинке - [src="тут какая-та картинка"]',
text: 1 1.1
link: 'тут хранить атрибут ссылки - [href="тут какая-та ссылка"]'
}
},
function updateModal(list) {
for let key in obj {
// тут теперь не надо делать проверку на тип ключа (id или tag)
}
}
this.p = p;
console.log(this.p = p);
console.log(this.p = p);
присваиваниеlet cart = [];
function Item(id, p) {
this.id = id;
this.p = p;
console.log(this.p = p);
}
function saveCart() {
localStorage.setItem("shoppingCart", JSON.stringify(cart));
}
function loadCart() {
cart = JSON.parse(localStorage.getItem("shoppingCart"));
if (cart === null) {
cart = []
} else {
let item = cart.push();
saveCart(item);
}
}
loadCart();
$('body').on('change', '.check', function(){
let modal = $('.modal');
if ($('input').is(':checked')) {
if (!modal.children().is('.item')) modal.html('');
} else {
modal.removeClass('modal-show').text('Здесь ничего нет');
}
if ($(this).prop('checked')) {
modal.addClass('modal-show');
}
let id = $(this).attr('id');
let p = $(this).parent().siblings('.copy, .copy-2');
Item(id, p);
});
А также зачем вы создаете класс Item, так конечно можно, ео в чем смысл?
function Item(id, p) {
this.id = id;
this.p = p;
}
var data = {
id: id,
p: p
}
<div class="item">
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
if ($('input').is(':checked')) {
if (!modal.children().is('.item')) modal.html('');
} else {
modal.removeClass('modal-show').text('Здесь ничего нет');
}
<div>
<p><input class="check" id="check-option-1" name="name" type="checkbox">
<label for="check-option-1"></label>
</p>
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
<div>
<p><input class="check" id="check-option-2" name="name" type="checkbox">
<label for="check-option-2"></label>
</p>
<p class="copy">2</p>
<p class="copy-2">2.1</p>
</div>
<div class="preview"><i class="fa fa-share" aria-hidden="true"></i></div>
<div class="modal">Здесь ничего нет</div>
$('body').on('change', '.check', function(){
let modal = $('.modal');
if ($('input').is(':checked')) {
if (!modal.children().is('.item')) modal.html('');
} else {
modal.removeClass('modal-show').text('Здесь ничего нет');
}
if ($(this).prop('checked')) {
modal.addClass('modal-show');
}
let id = $(this).attr('id');
let p = $(this).parent().siblings('.copy, .copy-2');
Item(id, p);
});
function Item(id, p) {
this.id = id;
this.p = p;
console.log(this.p = p);
}
let item = cart.push();
for (var i in cart) {
if (cart[i].id === id) {
$('#' + id).prop('checked', true);
saveCart();
return;
}
а как теперь правильно выводить данные в модальное окно ?
В любом случае для обоих вариантов мне надо понять, что же вы хотите в конечном варианте видеть в модальном окне. Если вас не затруднит, дайте как образец - готовый html, который будет в modal.innerHTML если отметить обе галки в примере
<div class="item">
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
<div class="item">
<p class="copy">2</p>
<p class="copy-2">2.1</p>
</div>
а вот эти 0: ... 1: ... откуда берутся?
0: {id: "check-option-1", p: ["1", "1.1"]}
id: "check-option-1"
p: ["1", "1.1"]
0: "1"
1: "1.1"
1: {id: "check-option-2", p: ["2", "2.1"]}
id: "check-option-2"
p: ["2", "2.1"]
0: "2"
1: "2.1"
<div class="item">
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
<div class="item">
<p class="copy">2</p>
<p class="copy-2">2.1</p>
</div>
возможно одинаковые имена в localStorage
У меня в моем примере вроде бы точно также называется
0: {id: "check-option-1", p: ["1", "1.1"]}
id: "check-option-1"
p: ["1", "1.1"]
0: "1"
1: "1.1"
link: 'путь к ссылке'
img: 'путь к картинке'
1: {id: "check-option-2", p: ["2", "2.1"]}
id: "check-option-2"
p: ["2", "2.1"]
0: "2"
1: "2.1"
link: 'путь к ссылке'
img: 'путь к картинке'
А в чем проблема?
{
0: {id: "check-option-1", p: ["1", "1.1"],link: 'путь к ссылке',img: 'путь к картинке'},
1: {id: "check-option-2", p: ["2", "2.1"],link: 'путь к ссылке',img: 'путь к картинке'}
}
let output = "";
for (let i in cart) {
output += '<div class="item">';
output += '<p class="copy">' + cart[i].p[i] + '</p>';
output += '<p class="copy-2">' + cart[i].p[i] + '</p>';
output += '</div>';
}
$(".modal").html(output);
let html = "";
list.forEach(item=>{
html += '<div class="item">';
html += item.p.map(text=>{
return '<p class="">'+text+'</p>'; // хз какой класс, ведь по вашей просьбе мы его нигде не сохранили
}).join(' ');
html += '</div>';
});
let output = "";
for (let i in cart) {
output += '<div class="item">';
output += '<p class="copy">' + cart[i].p[i] + '</p>';
output += '<p class="copy-2">' + cart[i].p[i] + '</p>';
output += '</div>';
}
$(".modal").html(output);
{
"check-option-1": {
"id": "check-option-1",
"p": [
"1",
"1.1"
]
},
"check-option-2": {
"id": "check-option-2",
"p": [
"2",
"2.1"
]
}
}
[
{
"id": "check-option-1",
"p": [
"1",
"1.1"
]
},
{
"id": "check-option-2",
"p": [
"2",
"2.1"
]
}
]
for (let i in cart)
for (let i in cart.list)
cart[i].p[i]
содержит ошибку. индекс i в cart.list[i] нельзяlet output = "";
console.log("cart:",cart);
for (let i in cart.list) {
output += '<div class="item">';
output += '<p class="copy">' + cart.list[i].p[0] + '</p>';
output += '<p class="copy-2">' + cart.list[i].p[1] + '</p>';
// в этом варианте если элементов P будет больше чем 2 то все элементы с индексами 2 и выше будут проигнорированы
output += '</div>';
}
let output = "";
console.log("cart:",cart);
for (let i in cart.list) {
output += '<div class="item">';
for (let p in cart.list[i].p) {
output += '<p class="copy">' + cart.list[i].p[p] + '</p>';
// в этом варианте неясно откуда брать класс для P
}
output += '</div>';
}
<div>
<p><input class="check" id="check-option-1" name="name" type="checkbox">
<label for="check-option-1"></label>
</p>
<img src="http://lorempixel.com/30/30/city">
<p class="copy">1</p>
<p class="copy-2">1.1</p>
</div>
$('body').on('change', '.check', function(){
let id = $(this).attr('id'); - это работает
let img = $(this).attr('src'); - а вот это пишет undefined
});
Иногда возникает ситуация, когда необходимо выбрать все дочерние элементы. Для этого в jQuery есть селектор >. Например, у нас есть следующий html код:<div id=”content”> <p>Привет</p> <p>Мы начинаем изучать jQuery</p> <p>И сейчас мы знакомимся с селекторами выборки элементов</p> </div>
И нам необходимо выбрать все p, которые находятся внутри тега div id=”content” Наш код будет выглядеть следующим образом:$(“#content > p”);
let img = $('img').attr('src');
P.S. Я так понял в моем варианте нужно полностью переделывать код ?
if (title !== undefined ) {
mHTML += '<a href="' + cartArray[i].a + '" title="' + cartArray[i].title + '"><img src="' + cartArray[i].img + '"></a>';
} else {
mHTML += '<a href="' + cartArray[i].a + '"><img src="' + cartArray[i].img + '"></a>';
}
[item1, item2, и т.д]
а {id1:item1, id2:item2, и т.д}
. Осталось от предыдущих попыток работы)[item1, item2, и т.д]
то я не прав и у вас все норм.{id1:item1, id2:item2, и т.д}
то тогда нарушена логика хранения и обработки данных в коде. 0: Item {id: "check-option-1", a: "http://lorempixel.com/30/30/city", title: "TITLE + добавляет всплывающую подсказку к тексту ссылки", img: "http://lorempixel.com/30/30/city", p: Array(2)}
1: Item {id: "check-option-2", a: "http://lorempixel.com/30/30/tech", img: "http://lorempixel.com/30/30/city", p: Array(2)}
[
{id: "check-option-1", a: "http://lorempixel.com/30/30/city", title: "TITLE + добавляет всплывающую подсказку к тексту ссылки", img: "http://lorempixel.com/30/30/city", p: Array(2)},
{id: "check-option-2", a: "http://lorempixel.com/30/30/tech ... }
]
{
"check-option-1": {id: "check-option-1", a: "http://lorempixel.com/30/30/city", title: "TITLE + добавляет всплывающую подсказку к тексту ссылки", img: "http://lorempixel.com/30/30/city", p: Array(2)}
"check-option-2": {id: "check-option-2", a: "http://lorempixel.com/30/30/tech
}
если у вас в локалсторадж хранятся записи вида [item1, item2, и т.д] то я не прав и у вас все норм.
если же у вас в локалсторадж хранятся записи вида {id1:item1, id2:item2, и т.д} то тогда нарушена логика
{id1:item1, id2:item2, и т.д}
?[item0, item1, и т.д]
- массив данных
и еще, у вас в вашем варианте используются именно цифровые индексы, то есть вы попытались смешать оба способа, но получили только усложнение и никакого профита, так как по ID вы элемент по id уже не сможете достать.
{
"check-option-1": {id: "check-option-1", a: "http://lorempixel.com/30/30/city", title: "TITLE + добавляет всплывающую подсказку к тексту ссылки", img: "http://lorempixel.com/30/30/city", p: Array(2)}
"check-option-2": {id: "check-option-2", a: "http://lorempixel.com/30/30/tech
}
[
{"id":"check-option-1","a":"http://lorempixel.com/30/30/city","title":"TITLE + добавляет всплывающую подсказку к тексту ссылки","img":"http://lorempixel.com/30/30/city","p":["1","1.1"]},
{"id":"check-option-2","a":"http://lorempixel.com/30/30/technics","img":"http://lorempixel.com/30/30/technics","p":["2","2.1"]}
]
localStorage.setItem(localName, JSON.stringify([]));
{
"check-option-1": {id: "check-option-1", a: "http://lorempixel.com/30/30/city", title: "TITLE + добавляет всплывающую подсказку к тексту ссылки", img: "http://lorempixel.com/30/30/city", p: Array(2)}
"check-option-2": {id: "check-option-2", a: "http://lorempixel.com/30/30/tech
}
localStorage.setItem(localName, JSON.stringify({}));
но у вас там проблемы похлеще. в локалсторадже лежат объекты, а вы читаете значения из локалсторадж в переменную cart, которая должна быть массивом, но после загрузки из локалсторадж становится объектом а затем пытаетесь обратится к cart как к массиву
obj.removeItemFromCart = function(id) {
console.log("45 строка:",cart);
cart = [] - тут изначально добавить пустой массив
cart = cart.filter(function(e) { return e.id !== id});
saveCart();
};
[
{"id":"check-option-1","a":"http://lorempixel.com/30/30/city","title":"TITLE + добавляет всплывающую подсказку к тексту ссылки","img":"http://lorempixel.com/30/30/city","p":["1","1.1"]},
{"id":"check-option-2","a":"http://lorempixel.com/30/30/technics","img":"http://lorempixel.com/30/30/technics","p":["2","2.1"]}
]
if ($(this).prop('checked')) {
let a = $(this).parent().siblings('a').attr('href');
let title = $(this).parent().siblings('a').attr('title');
let img = $(this).parent().siblings().children('img').attr('src');
let p = $(this).parent().siblings('.copy, .copy-2');
shoppingCart.addItemToCart(id, a, title, img, p);
modalCart();
modal.addClass('modal-show');
} else {
shoppingCart.removeItemFromCart(id);
modalCart();
}