Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.07.2011, 19:09
Новичок на форуме
Отправить личное сообщение для PanJavkin Посмотреть профиль Найти все сообщения от PanJavkin
 
Регистрация: 14.07.2011
Сообщений: 3

[Решено] Сохранение значения между вызовами функции
День добрый, не так давно изучаю js и ради тренировки пишу простую записную книжку для себя. Принцип простой - в окне есть div с текстом, по нажатию кнопки он превращается в textarea, редактируется, и по нажатию другой кнопки сохраняется.
Возникла проблема с реализацией кнопки отмены (у меня "Редактировать" и "Отменить" это одна функция). В идеале, если внесены изменения и нажата кнопка отмены, то все изменения должны отбрасываться и див возвращается в первоначальное состояние. Пока что я это реализовал через глобальный объект, записывая в него изначальный текст, но по моему это далеко не самый лучший и красивый вариант.

Собственно сам код:
// Объекст для сохранения изначального текста дива
var notesSave = new Object();

// id - номер выбранного дива. save - сохранение изменений, 0 - нет, 1 - да.
function editText(id, save)
	{
	var oldTag = document.getElementById('id'+id);

	// Проверяем, был ли уже сохранен изначальный текст, если нет, сохраняем
	if (notesSave[id] === undefined)notesSave[id] = oldTag.innerHTML;

	//Определяем направление замены div-textarea
	if (oldTag.localName === 'DIV') // Из div в textarea
		{
		var newTag = document.createElement('textarea');
		newTag.value = oldTag.innerHTML.replace(/<br>/gm, '\n');
		document.getElementById('edit'+id).innerText = 'Отменить';
		var url = '/notes/edit/id'+id;

		}else if (oldTag.localName === 'TEXTAREA') // Из textarea в div
			{
			var newTag = document.createElement('div');

			// Если выбранно сохранение, то вернуть в див новый текст
			if(save)newTag.innerHTML = oldTag.value.replace(/\n/gm, '<br>');
			// Иначе оставить старый
			else
			newTag.innerHTML = notesSave[id];
			document.getElementById('edit'+id).innerText = 'Редактировать';
			var url = '';
			}
	newTag.id = oldTag.id;
	newTag.className = oldTag.className;
	document.getElementById('base'+id).replaceChild(newTag, oldTag);
	history.pushState(null, null, url);
	}

Да, безопасность и оптимизация пока что не на высоте, ими буду потом заниматься, сначала хочу все это сделать рабочим.


Хтмл, все значения (текст заметки, даты, номера после id, в данном случае "2") подставляются в php.
<div id="status2">&nbsp;</div>
	<div id="base2">
	id: 2<br>
	<div id="id2" class="note-box">Текст заметки</div><br>
	Дата создания: 2011-07-14 00:47:50<br>
	Дата редактирования: <span id="update2">2011-07-14 18:14:08</span><br>
	<input type="submit" onclick="editText('2')" value="Редактировать" id="edit2">
	<input type="submit" onclick="saveNote(2, 1)" value="Сохранить">
	<input type="submit" onclick="deleteNote('2')" value="Удалить">
	<hr>
	</div>

Смотрел в сторону замыканий, но не срослось, то ли я что-то не так делаю, то ли одно из двух.

Подскажите, пожалуйста, более элегантный алгоритм, без засорения глобальными переменными, либо как это можно реализовать в том же замыкании.

Заранее благодарю.


upd: сейчас заметил, что сохраняется только самый первый текст, без учета последующих правок, но это в принципе не трудно исправить в случае с объектом.

Последний раз редактировалось PanJavkin, 22.07.2011 в 23:00. Причина: Ответ дан.
Ответить с цитированием
  #2 (permalink)  
Старый 15.07.2011, 01:14
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Особо не вникал в код, но вообще принцип такой и есть, только я бы не создавал новую глобальную переменную, а дал бы свойство для editText (editText.tmp = "тут мы храним наш темповый текст)").

Или можно не заменять div на textarea, а создать сразу оба и просто менять свойство display (none/block) и тогда вообще ничего не придётся никуда записывать)

Последний раз редактировалось kobezzza, 15.07.2011 в 01:16.
Ответить с цитированием
  #3 (permalink)  
Старый 15.07.2011, 01:44
Новичок на форуме
Отправить личное сообщение для PanJavkin Посмотреть профиль Найти все сообщения от PanJavkin
 
Регистрация: 14.07.2011
Сообщений: 3

kobezzza
О! Избавиться от глобальных переменных и было целью, спасибо огромное =)

Второй вариант, по моему, слишком не удобный и затратный, а вот первый как раз то, что надо. Честно говоря, даже и думать забыл, что у функций могут быть свойства.

Последний раз редактировалось PanJavkin, 15.07.2011 в 01:50.
Ответить с цитированием
  #4 (permalink)  
Старый 15.07.2011, 01:51
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Функция - это объект, а у любого объекта могут быть свойства, главное не путайте с примитивами (числа, строки, логические, undefined, null (хотя почему то typeof null == "object" Оо)), они хоть и могут трактоваться как объект, но свойства иметь не могут (пользовательские).
var a = new String("Вася");
a.prop = "Свойство"; // Всё ок
var b = "Вася";
b.prop = "Свойство"; // Ошибочка


Но, как я говорил выше, что примитивы могут трактоваться как объекты, то такая запись вполне справедлива:
var a = "Вася";
a.replace("а", "о"); // используем метод для примитива

или даже так:
var a = "Вася".replace("a", "о");

Последний раз редактировалось kobezzza, 15.07.2011 в 02:07.
Ответить с цитированием
  #5 (permalink)  
Старый 15.07.2011, 02:40
Новичок на форуме
Отправить личное сообщение для PanJavkin Посмотреть профиль Найти все сообщения от PanJavkin
 
Регистрация: 14.07.2011
Сообщений: 3

Ага, как-то потратил пару дней на изучение типизации, но из-за того что у функций есть свой специальный синтаксис, отличный от объектов, то и воспринимал их отдельно, теперь буду внимательнее, еще раз спасибо.

И кстати, примитивы не трактуются как объекты, а просто создается временный объект-обертка, свойства и методы которого используются.
Ответить с цитированием
  #6 (permalink)  
Старый 15.07.2011, 02:42
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
И кстати, примитивы не трактуются как объекты, а просто создается временный объект-обертка, свойства и методы которого используются.
Я это и имел ввиду, просто мне нравится термин "трактоваться", кстати я его запомнил из книжки по JS, не помню автора.

Всегда пожалуйста)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Превращение значения обьекта в название функции. alexandre Общие вопросы Javascript 4 16.02.2011 01:04
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03
Возвращение значения из функции dba Events/DOM/Window 21 06.10.2009 01:33