[Решено] Сохранение значения между вызовами функции
День добрый, не так давно изучаю 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"> </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: сейчас заметил, что сохраняется только самый первый текст, без учета последующих правок, но это в принципе не трудно исправить в случае с объектом. |
Особо не вникал в код, но вообще принцип такой и есть, только я бы не создавал новую глобальную переменную, а дал бы свойство для editText (editText.tmp = "тут мы храним наш темповый текст)").
Или можно не заменять div на textarea, а создать сразу оба и просто менять свойство display (none/block) и тогда вообще ничего не придётся никуда записывать) |
kobezzza
О! Избавиться от глобальных переменных и было целью, спасибо огромное =) Второй вариант, по моему, слишком не удобный и затратный, а вот первый как раз то, что надо. Честно говоря, даже и думать забыл, что у функций могут быть свойства. |
Функция - это объект, а у любого объекта могут быть свойства, главное не путайте с примитивами (числа, строки, логические, undefined, null (хотя почему то typeof null == "object" Оо)), они хоть и могут трактоваться как объект, но свойства иметь не могут (пользовательские).
var a = new String("Вася");
a.prop = "Свойство"; // Всё ок
var b = "Вася";
b.prop = "Свойство"; // Ошибочка
Но, как я говорил выше, что примитивы могут трактоваться как объекты, то такая запись вполне справедлива:
var a = "Вася";
a.replace("а", "о"); // используем метод для примитива
или даже так:
var a = "Вася".replace("a", "о");
|
Ага, как-то потратил пару дней на изучение типизации, но из-за того что у функций есть свой специальный синтаксис, отличный от объектов, то и воспринимал их отдельно, теперь буду внимательнее, еще раз спасибо.
И кстати, примитивы не трактуются как объекты, а просто создается временный объект-обертка, свойства и методы которого используются. |
Цитата:
Всегда пожалуйста) |
| Часовой пояс GMT +3, время: 22:03. |