js запоминание формы в cookies

Статус
В этой теме нельзя размещать новые ответы.

o_nix

Хранитель порядка
Регистрация
7 Ноя 2007
Сообщения
1.070
Реакции
1.063
Задача позволить пользовотелю сохранять введённые им в форму данные чтобы при перезагрузке страницы ему не пришлось всё вбивать заново
Нашёл вот такой вот примерчик который позволяет это сделать
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">	
<html>	
<head>	
    <title>Form Session</title>	
</head>	
<body>	
<script type="text/javascript">	
<!--	
/**	
* Сохраняем форму. Функция принимает ссылку на форму. Форма должна иметь	
* уникальный аттрибут ID.	
*/	
function saveFormSession(form) {	
  if(!form||!form.id||!/^[^;=]+$/.test(form.id)) return;	
  var data="", tok, el, safe_name;	
  for(var i=0; i<form.elements.length; i++) {	
    if((el=form.elements[i]).name==""||el.getAttribute("skip_form_save")!=null) continue;	
    safe_name=el.name.replace(/([)\\])/g, "\\$1");	
    switch(el.type) {	
      case "text":	
      case "textarea": tok="v("+safe_name+"):"+el.value.replace(/([|\\])/g, "\\$1")+"||"; break;	
      case "radio":	
      case "checkbox": tok="s("+safe_name+"):"+(el.checked? "1": "0")+"||"; break;	
      case "select-one": tok="i("+safe_name+"):"+(el.selectedIndex)+"||"; break;	
      default: tok="";	
    }	
    data+=tok;	
  }	
  if(data>=4000) return alert("Can't save form into cookie, to much data...");	
  document.cookie="ses"+form.id+"="+escape(data);
 
  return true;
}	
/**	
* Восстановить значение формы. Форма должна иметь уникальный атттрибут ID.	
*/	
function restoreFormSession(form) {	
   if(!form||!form.id||!/^[^;=]+$/.test(form.id)) return false;	
   var strt, end, data, nm, dat;	
   if((strt=document.cookie.indexOf("ses"+form.id))<0) return false;	
   if((end=document.cookie.indexOf(";", strt + form.id.length + 3))<0) end=document.cookie.length;	
   data=unescape(document.cookie.substring(strt + form.id.length + 4, end)).split("||");	
   for(var i=0; i<data.length-1; i++) {	
      nm=/^[vsi]\(((?:[^)\\]|(?:\\\))|(?:\\\\))+)\)\:/.exec(data[i]);	
      nm[1]=nm[1].replace(/\\([)\\])/g, "$1");	
      dat=data[i].substr(nm[0].length).replace(/\\([|\\])/g, "$1");	
      switch(data[i].charAt(0)) {	
        case "v": form.elements[nm[1]].value=dat; break;	
        case "s": form.elements[nm[1]].checked=(dat=="1"? true: false); break;	
        case "i": form.elements[nm[1]].selectedIndex=dat; break;	
      }	
   }
 
   return true;
}	
//-->	
</script>	
<!-- Пример использования -->	
<form id="test1">	
<input name="text1" type="text" /><br />
<input name="text2" type="text" /><br />
<input name="text3" type="text" /><br />
<input name="text4" type="text" /><br />
<input name="text5" type="text" /><br />
<input name="text6" type="text" /><br />	
<br />	
<input type="button" onclick="saveFormSession(this.form)" value="Save form" />&nbsp;	
<input type="button" onclick="restoreFormSession(this.form)" value="Restore form" />	
</form>	
</body>	
</html>

Вводим данные в инпуты жмём кнопку сохранить.
обновляем страницу - введённых данных нет
жмём восстановить - вводятся данные сохранённые в куках.
всё нормально но почемуто функция восстановления введённых данных
не восстанавливает форму если колличество элементов в ней изменилось

тоесть открываем исходный код страницы и убираем input 3 например
сохраняем обновляем страницу жмём кнопку восстановить
восстанавливаются данные только до той формы которую удалили
всё что идёт далее не восстанавливается - а мне это крайне необходимо тк у меня колличество элементов может изменятся самим пользовотелем

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

Час уже мучаюсь никак не пойму где и что надо дописать.
Помогите плиз ...

---------- Post added at 16:11 ---------- Previous post was at 14:54 ----------

уж незнаю насколько криво но сделал - работает :D
PHP:
        case "v":{ 
		if (form.elements[nm[1]]) {
		form.elements[nm[1]].value=dat; break;
} else break;
		}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху