0

我需要将表单的状态保存在 cookie 中,以便可以记住给定用户的设置。我正在使用 jQuery,因此我的计划是:

Saving:
//generate a param string from the form settings
var paramString = $.param($("#my-form").serializeArray());
//save it to a cookie
$.cookie("my-form-cookie", paramString);

Loading:
//get the cookie value
var savedParams = $.cookie("my-form-cookie")
//turn it into an object with field names as keys and field values as values
var formObject = JSON.parse('{"' + decodeURI(savedParams).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
//go through this, modifying the form
...

这是目前拼图中缺失的部分。

我打算做的是这样的(伪代码而不是js)

for every key/value pair (key,value)
  find element(s) with name = key
  if there's more than one, it's probably radio buttons/checkboxes:
    - check the one with value = value and uncheck the rest
  if there's exactly one
    - set the value = value

在我着手编写一个用于执行此操作的函数之前,该函数采用表单 id 和参数样式的字符串,我在想其他人要么 a) 以比我更彻底的方式完成了此操作,要么 b) 尝试过它并决定这是一个坏主意,或者注定要失败。

有人在 a) 或 b) 上有任何意见吗?

谢谢!最大限度

4

1 回答 1

0

这就是我最终做的事情。它有明确的清理范围,但似乎工作正常。它处理嵌套参数和数组样式参数。当用于恢复状态时,您可以添加一个类dont-cookie以形成您不想从 cookie 中设置的元素。

//convert the form's state to a params string and save it to a cookie with the 
//name form-<form_id>.  Note that all form values are saved to 
//the cookie, even the ones with .dont-save (these are ignored on load though)
function saveFormStateToCookie(form, cookie){
  //jqueryfy the form if it's not already
  if(typeof(form) != "object")
    form = $(form);  
  if(typeof(cookie) == "undefined")
    cookie = formCookieName(form);    
  //console.log("using cookie name '"+cookie+"'");

  var paramString = $.param(form.serializeArray());
  //console.log("saving: (unescaped)\n"+unescape(paramString));
  $.cookie(cookie, paramString, {path: "/"});
}


function loadFormStateFromCookie(form, cookie){
  //jqueryfy form if it's not already
  if(typeof(form) != "object")
    form = $(form);  
  if(typeof(cookie) == "undefined")
    cookie = formCookieName(form);
  //console.log("using cookie name '"+cookie+"'");
  //get the cookie value
  var paramString = $.cookie(cookie);
  //console.log("loaded:(unescaped)\n"+unescape(paramString));
  //what if it's blank, or the cookie doesn't exist?
  if(paramString){
    //turn it into an object with field names as keys and field values as values
    var formObject = QueryStringToHash(paramString);
    var elements, checkableElements, matchedElement;
    var changedElements = [];
    //set all checkboxes and radio buttons in the form to be blank
    form.find("[type='radio'], [type='checkbox']").not(".dont-cookie").removeAttr('checked');
    //go through this, modifying the form  
    $.each(formObject, function(name,values){
      //note: value can be an array of values or a string.  Let's make it always an array, to be consistent
      if(typeof(values) === "string"){
        values = [values]; 
      }
      //find all elements matching the name.
      elements = form.find("[name='"+name+"']").not(".dont-cookie");

      if(elements.size() > 0){   
        //iterate over values
        $.each(values, function(i,value){
          //is there a checkbox/radio with this value,  which ISN'T in changedElements? 
          var checkboxes = elements.filter("[type='radio'], [type='checkbox']").filter("[value='"+value+"'], [value='"+value.replace(/\+/g, " ")+"']").filter(function(i){ return  changedElements.indexOf($(this)) === -1});
          //yes there is - check it and add it to changedElements
          if(checkboxes.size() > 0){
            $.each(checkboxes, function(j,checkbox){
              checkbox = $(checkbox);
              checkbox.attr("checked", "checked");
              changedElements.push(checkbox);
            });
          } else {
            //THIS IS WIPING OVER ALL THE CHECKBOXES:  WE NEED TO JUST DO IT TO NON-CHECKBOXES
            //no there isn't: set their val to value, then add them to changedElements
            $.each(elements.not("[type='radio'], [type='checkbox']"), function(i, element){
              element = $(element);
              element.val(value);
              changedElements.push(element);
            });
          }
        });
      }
    });
  } else {
    //console.log("Couldn't find a cookie matching "+cookie);
  }
}   
于 2013-11-26T10:39:10.493 回答