I choose , I like…………
要走好明天的路,必须记住昨天走过的路,思索今天正在走着的路。
 

前面已经实现了个性化主页的核心功能,栏目的添加、设置和关闭;但是还存在一些问题,比如用户定制的栏目信息无法保存,在刷新页面之后整个页面又成为空白,需要重新添加栏目。这对于用户来说是很不方便的,因此需要提供一种栏目定制信息存取的机制,在离开页面时保存用户当前的栏目定制信息,在页面加载时读取已有的栏目定制信息,初始化主页。

1.                     存储方式的选择

如果有后台数据库的支持,可以将用户的栏目定制信息保存在数据库中,与用户的信息相关联。前面实现的个性化主页并不要求用户在网站上进行注册和登录,因此这里将栏目定制信息保存在Cookie中。

关于栏目定制信息的存储格式也是一个值得考虑的问题,有以下几种方式可供选择。

保存为XML格式

XML是一种通用的文本格式,在客户端解析XML文档也有相关的第三方提供跨浏览器的解决方案。但是对于目前需要解决的问题,XML的方式显得比较笨重,有小题大做的嫌疑,在效率上并不是最优。

保存为普通文本

保存为普通文本的方式在实现上比较简单,不需要引入有关XML解析的脚本库,通过简单的字符串处理就可以完成保存任务。但是这种方式的缺点在于可扩展性较差,现在栏目定制信息的内容非常简单,如果以后有了新的需求。在这种情况下,如果采用普通文本保存栏目定制信息,相关的JavaScript代码可能需要进行较多的修改。

保存为JSON格式的文本

JSON格式的文本,其内容实际上是一段JavaScript代码,它可以表示任何JavaScript对象。无论采用哪种方式保存栏目定制信息,最终都需要将其转化为JavaScript对象,在JavaScript代码中使用。如果使用JSON的方式则直接保存我们所需要的JavaScript对象,在使用时只需读取cookie,调用eval方法就可以得到栏目定制信息的JavaScript对象。这种方式在效率和可扩展性上都是相当不错的。

经过以上比较,选择JSON格式文本保存栏目定制信息,实际保存在cookie中的文本如下:

[

       [

              “ModelName”, “Type”, “dbName”, “dbTableName”, “dbFieldName”, “dbFilter”

],

       [

              “ModelName”, “Type”, “xmlName”, “xmlURL”, “”, “”

]

]

它表示一个JavaScript数组对象,它的每一个成员都是一个字符串数组,分别代表了个性化页面中各个容器中栏目的提示性内容(传参数)。

2.                     Cookie的存储和读取

SetCookieReadCookie方法分别实现了cookie的存储和读取,实现方法比较简单,可参考如下代码:

       function SetCookie(cookieName, cookieValue, nDays){

              //当前时间

              var today = new Date();

              //Cookie 失效时间

              var expire = new Date();

              //如果没有指定 nDays 参数,默认 cookie 保存 1

              if (nDays == null || nDays == 0) nDays == 1;

              expire.setTime(today.getTime() + 3600000 * 24 * nDays);

              //设置cookie的值

              document.cookie = cookieName + "=" + escape(cookieValue) + ";expires=" + expire.toGMTString();

       }

       function ReadCookie(cookieName){

              //读取 cookie 的值

              var theCookie = "" + document.cookie;

              //找到 cookieName 对应的位置

              var ind = theCookie.indexOf(cookieName);

              //cookie 不存在

              if (ind == -1 || cookieName == "") return "";

              //读取 cookieName 对应的 cookie

              var ind1 = theCookie.indexOf(';',ind);

              if (ind1 == -1) ind1 = theCookie.length;

              return unescape(theCookie.substring(ind + cookieName.length + 1, ind1));

       }

3.                     栏目定制信息的保存

栏目定制信息的保存是在浏览器关闭或者离开页面时进行的,也就是在bodyonunload事件响应函数saveLayout()中完成栏目定制信息的保存。具体的实现方法是遍历每个栏目容器中<div>对象,将参数保存在cookie中。在添加栏目的过程中,需要保存的参数使用document.getElementById(“……”).valuedocument.getElementById(“……”).innerHTML获取,然后将其读取处理。代码如下:

       function saveLayout(){

              //字符串数组对象

              var data = [];

              //栏目容器列表

              var contatiners = $("xmlContainer","dbContainer");

              //遍历每一个栏目容器

              container.each(function(container){

                     //字符串数组对象

                     var modulesData = [];

                     //栏目div对象

                     var modules = document.getElementByClassName("modules", container);

                     //遍历容器中的每一个栏目对象

                     modules.each(function(module){

                            //获取参数值

                            //将获取到的每个参数值赋值给数组

                            modulesData.push(value);

                     });

                     //将字符串数组对象加入data数组

                     data.push("["""+ modulesData.join(""",""") + """]");

              });

              //连接最终保存到cookie中的JSON字符串

              var json = "([" + data.join(",") + "])";

              //cookie中保存JSON字符串

              SetCookie("homepage", json, 7);

       }

 

自定义栏目定制信息保存地址,通过document.execCommand("SaveAs")实现“另存为”。

 

4.                     栏目定制信息的读取

栏目定制信息已经成功地保存到cookie中,下面要完成的功能是从cookie中读取出相应的栏目定制信息,然后初始化栏目。这些操作都将在bodyonload响应函数init()中进行的。代码如下:

       function init(){

              //读取cookie信息

              var cookieDate = ReadCookie("homepage");

              //栏目定制信息

              var data;

              //如果没有cookie信息,则使用默认的栏目定制信息

              if (!cookieData){

                     data =

[

    [

           “dbSource”,“db”, “deschema_test”, “XSXX”, “studentname,ClassNo”, “3”

],

    [

           “xmlSource”, “xml”, “authors”, “e:/xml”, “”, “”

]

]

              }else{

                     //使用cookie中的栏目定制信息

                     data = eval(cookieData);

              }

              //栏目容器列表

              var contatiners = $("xmlContainer","dbContainer");

              //遍历data中的栏目定制信息

              data.each(function(modulesData, index){

                     //使用Ajax技术的xmlHttpRequest对象完成异步交互;

//将获取的数据显示在页面上

              });

       }

 

posted on 2008-10-19 19:29  飞翔的Angela  阅读(1283)  评论(0编辑  收藏  举报