Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Lockal Storage и Chrom (https://javascript.ru/forum/events/81823-lockal-storage-i-chrom.html)

Konstantin47 02.02.2021 14:16

Lockal Storage и Chrom
 
Здравствуйте!
Такой вопрос, сохранение работает в Мозиле, но не работает в Chrom
и в Opere, почему?

что может быть не так?


Cпасибо

<table>
	<tr><th scope="col">Nazwę</th>
	    <th scope="col" >Opis</th>
		<th scope="col">&nbsp;</th>
		</tr>
		
		 <tr>
		
		 <td>
                    <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
				</tr>
				<tr>
				<td>
		 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
		
	</tr>
	<tr>
	<td>
		 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
		
	</tr>
	<tr><td>
	 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
	</tr>
	<tr>
	<td>
		 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
		
	</tr>
	<tr> <td>
	 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
		
	</tr>
	<tr>
	<td>
		 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
	</tr>
	<tr><td>
	 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
	</tr>
	<tr>
	<td>
		 <label>
                        <input type="text" name="text" ">
                    </label>
					
                </td>
                <td>
                    <label>
                       <input type="text" name="text" ">
                    </label>
                </td>
				</div>
				 <div class="item_box">
		
	</tr>
	 <div id="cart_content"></div>
</div>	
</table>
</body>



let div = document.getElementById('div');
div.addEventListener('click', changeValue);
div.addEventListener('blur', changeEnd);

function changeValue(event){
  let target = event.target;
  target.setAttribute('contenteditable', true);
}

function changeEnd(){
  div.removeAttribute('contenteditable');
  console.log(div.innerText)
}


// Получаем данные из LocalStorage
function getCartData(){
	return JSON.parse(localStorage.getItem('cart'));
}
// Записываем данные в LocalStorage
function setCartData(o){
	localStorage.setItem('cart', JSON.stringify(o));
	return false;
	</script>

рони 02.02.2021 14:25

Цитата:

Сообщение от Konstantin47
что может быть не так?

проверьте на сервере свой код.

Konstantin47 10.02.2021 17:39

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


localStorage.setItem('div',changeValue);

	localStorage.getItem('div ');


Но вопрос

вот происходит у меня событие ( смысл всего, в ячейки таблицы писать текст и чтобы не пропадал). Значения события у меня - changeValue,
но почему не сохраняет значение - я уже перепробовал вообще все названия блоков от input до просто table

По моему мнению - раз все события происходят в главном блоке с id номером - div
(уже думал путаница из-за имени, тоже менял)

- там по клику мышки активируется возможность интерактивной ячейки и происходит событие, то чтобы текущую надпись запомнить - localStorage.setItem('div',changeValue);
но это все снова работает только в Мозиле, или так вообще нельзя делать?
ps я пока сам не понимаю, каким местом, читаю инструкцию - записать, показать вижу, а - что сохраняем, и значение его - а толку - видите

рони 10.02.2021 18:48

Konstantin47,
структуру таблицы неплохо бы исправить, выкинуть все div или переместить их в ячейки td.

рони 10.02.2021 19:00

Konstantin47,
на всякий случай

Редактирование текста ячеек таблицы с сохранением

Konstantin47 10.02.2021 19:28

Рони, спасибо большое!

Konstantin47 10.02.2021 19:45

<body>

 <table id='div'>


   <tr>
   
   <th scope="col">Nazwę</th>
   <th scope="col" >Opis</th>
   <th scope="col">&nbsp;</th>
		
		
   </tr>
		
   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

 </table>


почти по примеру сделал таблицу

хорошо, а в таком случае - key для сохранения - ячейка или td будет?
мне, чтоб хоть одно точное значение знать

с моим старым кодом, точно также не работает

рони 10.02.2021 20:00

Konstantin47,
не понимаю что вы пишите, ни код, ни описание, могу только гадать, что вы хотите сделать.

Konstantin47 10.02.2021 20:35

щас


<body>

 <table id='div'>


   <tr>
   
   <th scope="col">Nazwę</th>
   <th scope="col" >Opis</th>
   <th scope="col">&nbsp;</th>
		
		
   </tr>
		
   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

   <tr>

     <td>1234</td>

     <td>1234</td>
	 
	 <td>1234</td>

   </tr>

 </table>
 
</body>

let div = document.getElementById('div');
div.addEventListener('click', changeValue);
div.addEventListener('blur', changeEnd);
  console.log(div);

function changeValue(event){
  let target = event.target;
  target.setAttribute('contenteditable', true);
  
}


function changeEnd(){
  div.removeAttribute('contenteditable');
  console.log(div.innerText)
}


   localStorage.setItem('div',changeValue);
   localStorage.getItem('div');


Если запустить будет, похоже, как у вас - таблица с активными ячейками
Cейчас хочу только, чтоб сохраняло данные LokalStorage в ячейках
(все, что показывал выше работало только в Мазиле)

voraa 10.02.2021 21:03

Вы чего сохранить то пытаетесь?
localStorage.setItem('div',changeValue); - это вы саму функцию туда пытаетесь засунуть. Она конечно как то в строку преобразуется вот в таком виде
"function changeValue(event){
let target = event.target;
target.setAttribute('contenteditable', true);

}"
Но это явно не то, что вам надо.

Konstantin47 10.02.2021 21:14

если честно, сохранить, то что будет введено в ячейку

voraa 10.02.2021 21:27

localStorage.setItem('div', '1234567');
alert (localStorage.getItem('div'));

Прекрасно работает и в Хроме и в Файрфоксе.

рони 10.02.2021 21:40

сохранение и редактирование содержимого ячеек таблицы js
 
Konstantin47,

двойной клик по ячейке, вход/выход из режима редактирования.
начальные данные указать в массиве arr и придумать любое новое имя.
пример tableEditor(tbody, arr, 'test') строка 67
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
    </style>
</head>
<body>
 <table id="table">
    <thead>
   <tr>
   <th scope="col">Nazwę</th>
   <th scope="col" >Opis</th>
   <th scope="col">&nbsp;</th>
   </tr>
   </thead>
   <tbody>

   </tbody>
 </table>
<script>
const tableEditor = (tbody, arr = [], localName = "tds") => {
    if (localStorage[localName]) arr = JSON.parse(localStorage.getItem(localName));
    let container = document.createDocumentFragment();
    arr.forEach((ar, j) => {
        let tr = document.createElement("tr");
        for (let txt of ar) {
            let td = document.createElement("td");
            td.innerHTML = txt;
            td.dataset.j = j;
            tr.append(td)
        }
        container.append(tr)
    });
    tbody.append(container);
    let input = document.createElement("input");

    tbody.addEventListener("dblclick", ({
        target
    }) => {
        if (input.parentNode) {
            let td = input.parentNode;
            let i = td.cellIndex;
            let j = td.dataset.j;
            input.remove();
            td.textContent = arr[j][i] = input.value;
            localStorage.setItem(localName, JSON.stringify(arr));
            
        }
        if (target.tagName == "TD") {
            input.value = target.textContent;
            target.textContent = "";
            target.append(input)
        }
    }, true);


}


let arr = [
    [1234, 1234],
    [1234, 1234]
];
let tbody = document.querySelector("#table tbody");
tableEditor(tbody, arr, "tdd")

</script>

</body>
</html>

voraa 10.02.2021 22:04

Как то так попробуйте
<body>
 
 <table id='div'>
 
 
   <tr>
    
   <th scope="col">Nazwę</th>
   <th scope="col" >Opis</th>
   <th scope="col">&nbsp;</th>
         
         
   </tr>
         
   <tr>
 
     <td>1234</td>
 
     <td>1234</td>
      
     <td>1234</td>
 
   </tr>
 
   <tr>
 
     <td>1234</td>
 
     <td>1234</td>
      
     <td>1234</td>
 
   </tr>
 
   <tr>
 
     <td>1234</td>
 
     <td>1234</td>
      
     <td>1234</td>
 
   </tr>
 
 </table>
  
<script>
let div = document.getElementById('div');
div.addEventListener('click', changeValue);
div.addEventListener('focusout', changeEnd);
 
function changeValue(event){
  event.target.setAttribute('contenteditable', true);
}
 
function changeEnd(event){
  event.target.removeAttribute('contenteditable');
  console.log(event.target.innerText)
  setValues ()
}
 
function setValues () {
	const tbd = document.getElementById('div').tBodies[0];
	const rws = tbd.rows;
	const v = [];
	for (let i=0; i<rws.length; i++) {
		const cls= rws[i].cells;
		const cv = []
		for (let j=0; j<cls.length; j++) {
			cv.push(cls[j].textContent);
		}
		v.push(cv);
	}
	localStorage.setItem('tblvalues',JSON.stringify(v)); 
	console.log(localStorage.getItem('tblvalues'))
}   

function restoreValues () {
	const tbd = document.getElementById('div').tBodies[0];
	const rws = tbd.rows;
	let tbv = localStorage.getItem('tblvalues')
	if (!tbv) return
	const v = JSON.parse(tbv);
	for (let i=0; i<rws.length; i++) {
		const cls= rws[i].cells;
		for (let j=0; j<cls.length; j++) {
			cls[j].textContent = v[i][j];
		}
	}
}   
restoreValues ()
</script>
</body>

Konstantin47 10.02.2021 23:02

Цитата:

Сообщение от voraa (Сообщение 533717)
localStorage.setItem('div', '1234567');
alert (localStorage.getItem('div'));

Прекрасно работает и в Хроме и в Файрфоксе.

ps но задать значение не с таблицы - это мой уровень, чтоб просто показало

Я, если честно, не понимал до таких примеров, откуда вообще брать условия и циклы для сохранения. сам абзац про JS LokalStorage c очень разных источников пересмотрел и только сами функции понял 9 сохранить, достать, удалить), а циклы...

Может подскажите - какой-то ресурс, с задачами и примерами решений? жизненными, вот, как активация форм input html, проверка паролей ,что именно в задачах с сайтами используется


ps то что связано с математикой и console.Log - я могу и степени и корни и всякие формулы посчитать, а такие же задачи, они совсем другие и я просто не понимаю, с какой стороны подходить.

Спасибо огромное за помощь!


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