自动保存草稿功能的原理

我们都知道网页是一种无状态的,每次都需要请求,响应,当一次请求完成后就与服务器断开连接了,所以我们不能像网页一样实现实时的交互功能,但是为了满足更多的需求一个比较无敌的程序员还是想到了实时交互的办法,所以ajax诞生了,这项技术最先应用于google地图,后来逐渐被大众化,所谓ajax其实是一项异步请求技术,简单来理解就是我们在看页面的时候当页面的内容发生了改变,我们不需要刷新页面,而是通过后台程序向服务器发送这个请求,然后再把响应结果悄无声息的展现在页面上,那么我们自动存稿的功能就很好理解了,在我们往编辑器里写内容的时候我们的后台程序会定时把内容发布到服务器上保存起来,然后等我们的文章写完发布之后如果发布成功了则把之前保存的草稿删除掉,如果没有保存成功则不删除等用户下次打开发布页面的时候把保存的草稿重新加载给用户,这样我们就完成了类似于word里面自动保存的功能了。

具体功能实现

第一步:我们需要创建一个ajax所需要的js对象,这个创建方法网上有很多代码,我也是随便找了一个拿来用,代码如下:

// AJAX类
function AJAXRequest() {
 var xmlObj = false;
 var CBfunc,ObjSelf;
 ObjSelf=this;
 try { xmlObj=new XMLHttpRequest; }
 catch(e) {
  try { xmlObj=new ActiveXObject("MSXML2.XMLHTTP"); }
  catch(e2) {
   try { xmlObj=new ActiveXObject("Microsoft.XMLHTTP"); }
   catch(e3) { xmlObj=false; }
  }
 }
 if (!xmlObj) return false;
 this.method="POST";
 this.url;
 this.async=true;
 this.content="";
 this.callback=function(cbobj) {return;}
 this.send=function() {
  if(!this.method||!this.url||!this.async) return false;
  xmlObj.open (this.method, this.url, this.async);
  if(this.method=="POST") xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlObj.onreadystatechange=function() {
   if(xmlObj.readyState==4) {
    if(xmlObj.status==200) {
     ObjSelf.callback(xmlObj);
    }
   }
  }
  if(this.method=="POST") xmlObj.send(this.content);
  else xmlObj.send(null);
 }
}

把这些代码复制下来放到一个js文件里,我们取名:ajaxrequest.js

接下来我们需要在页面需要保存草稿的地方加一个提示,每次存稿需要提醒用户保存成功了,我们在编辑器的边上放上一个div就可以了<div id="AutoSaveMsg"></div>,一会儿我们通过js,动态的把提示消息写入到这个div里,就完成了自动提示的功能。

第二步:编写保存草稿的程序代码

这个功能也很好实现,新建一个页面,取名:autosave.asp,然后写上如下代码:

<%

Dim PostContent,action,objStream
''获取操作,是保存草稿还是恢复草稿
action=Request.Form("action")
''获取草稿内容
PostContent=Request.Form("postcontent")
IF action="restore" Then

''使用 ADODB.Stream 来进行文件操作
        Set objStream = Server.CreateObject("ADODB.Stream")
        With objStream
            .Type = 2
            .Mode = 3
            .Open
            ''文件名为 autosave.txt
            .LoadFromFile(Server.MapPath("autosave/autosave.txt"))
            .Charset = "gb2312"
            ''.Position = 0
            PostContent = .ReadText()
            .Close
        End With

Set objStream = NoThing
        ''输出草稿
        IF PostContent<>"" Then Response.Write(PostContent)

Else

''保存草稿,如果草稿内容不为空则进行保存操作
    IF PostContent<>Empty Then
        ''使用 ADODB.Stream 来进行文件操作
        Set objStream = Server.CreateObject("ADODB.Stream")
        With objStream
            .Type = 2
            .Mode = 3
            .Open
            .Charset = "utf-8"
            .Position = objStream.Size
            .WriteText= PostContent
            .SaveToFile Server.MapPath("autosave/autosave.txt"),2
            .Close
        End With

Set objStream = NoThing
        ''输出保存是否成功信息
        If Err.Number=0 then
            Response.Write("<font style=""font-size:12px;color:green;"">"&Now()&" AutoSave success!</font>")
        Else
            Response.Write("<font style=""font-size:12px;color:red;"">"&Now()&" Auto-Save failed,errorNo:"&Err.Number&",error message:"&Err.Dscription&"</font>")
        End If
    End IF

End IF
%>

这段代码很简单,但是为了方便不懂asp的朋友我还是简单的说一下:

首先定义了两个变量,一个是action,这个是保存状态的,需要判断我们是保存草稿,还是读取草稿,这个原理就像是添加修改文章一样,PostContent=Request.Form("postcontent") 这句代码是获取需要保存的内容,我们的if语句判断是第一种情况则是读取文件,把txt里的内容读取出来输出到页面上,而else则是保存草稿,当我们保存成功之后我们把时间和是否保存成功的消息写到页面上,然后用js来读取这个页面的信息,我们就完成异步操作了。

OK,下一步我们需要建立一个js文件:

第三步:创建处理的js文件

创建一个js文件,取名为:autosave.js然后把如下代码复制进去:

// 要保存的内容对象FormContent
var FormContent=document.getElementById("TxtContents");

// 显示返回信息的对象
var AutoSaveMsg=document.getElementById("AutoSaveMsg");
// 自动保存时间间隔
var AutoSaveTime=60000;
// 计时器对象
var AutoSaveTimer;
// 首先设置一次自动保存状态
SetAutoSave();
// 自动保存函数
function AutoSave() 
{
    // 如果内容为空,则不进行处理,直接返回
    if(!FormContent.value) return;
    // 创建AJAXRequest对象,
    var ajaxobj=new AJAXRequest;
    ajaxobj.url="autosave.asp";
    ajaxobj.content="postcontent="+escape(FormContent.value);
    ajaxobj.callback=function(xmlObj) 
 {
        // 显示反馈信息
        AutoSaveMsg.innerHTML=xmlObj.responseText;
    }
    ajaxobj.send();
}

// 设置自动保存状态函数
function SetAutoSave() 
{
        AutoSaveTimer=setInterval("AutoSave()",AutoSaveTime);
}

// 恢复最后保存的草稿
function AutoSaveRestore()
{
    // 创建AJAXRequest对象
    var ajaxobj=new AJAXRequest;
    // 提示用户正在恢复
    AutoSaveMsg.innerHTML="正在恢复,请稍候……"
    ajaxobj.url="autosave.asp";
    ajaxobj.content="action=restore";
    ajaxobj.callback=function(xmlObj)
 {
        // 提示用户恢复成功
        AutoSaveMsg.innerHTML="恢复最后保存成功";
        // 如果内容为空则不改写textarea的内容
        if(xmlObj.responseText!="")
  {
            // 恢复草稿
            FormContent.value=xmlObj.responseText;
        }
    }
    ajaxobj.send()
}

代码讲解:

首先创建了两个对象用来得到需要保存的信息和返回信息的对象,第二个autosavemsg存储的是那个div 的对象,在下面AutoSaveMsg.innerHTML="正在恢复,请稍候……" 这个时候用到的。

然后定义的是时间间隔,以及具体的实现方法,第一次我们需要让他自动先保存一下,然后就会一直按我们的时候不停的保存了,至于为什么这样做,你可以去查一下setInterval这个函数的用法,网上有很不错的介绍。

SetAutoSave() 方法是用来自动保存的,没有什么好说的

AutoSave() 这个方法是用来自动保存草稿的,首先建立了之前我们保存的那个ajax对象,所以我们用的时候需要把这些代码合并到一起,所以我们需要在页面上建立两个引用,代码如下:

<!-- 将JS代码放在所有对象之后,以免在页面未加载完成时出现对象不存在的错误 -->
<!-- AJAX类 -->
<script type="text/javascript" src="TianDaoEdit/ajaxrequest.js"></script>
<!-- 自动保存代码 -->
<script type="text/javascript" src="TianDaoEdit/autosave.js"></script>

在需要自动存稿的地方把这两句引用加上,这里面的js对象就全部成公用的了,所以在函数里我们用var ajaxobj=new AJAXRequest;实例化上面那个js里的对象就不会有问题了,然后就是设置几个参数,ajaxobj.url="autosave.asp"; 这个文件是刚才我们编写的asp处理程序,也就是ajax需要请求的页面地址,你可以改成你喜欢的名字,ajaxobj.content="postcontent="+escape(FormContent.value);这句是向上面的地址发送的参数,escape是一个加密函数,直接这样用就可以了。

再下面就是得到返回信息写到页面上那个提示的div里AutoSaveMsg.innerHTML=xmlObj.responseText;
这样我们自动存稿功能就算是完成了。

看那个提示:2010-7-21 12:51:44 AutoSave success!  然后再去ftp上看看,有一个文件,下载下来看看是自己的草稿,保存成功了。提示语你可以改成汉字的,我最近在练英语,自己知道的单词在编程的时候喜欢写英文,呵呵。

AutoSaveRestore() 这个函数是恢复保存的草稿,功能和上面的类似,只不过返回的信息写入到了FormContent.value=xmlObj.responseText;这个里,而FormContent这个对象是你页面上编辑器的那个input,所以就把保存的内容写到这里面来了,这样我们就把保存的信息给恢复了。

注意问题:

如果你的编辑器是一个iframe编辑器,则input的value取值方法需要变一下了

function Autogetinfo()
{
  document.form1.TxtContents.value = frames.message.document.body.innerHTML;
}
setInterval("Autogetinfo()",1000);

这是我的代码,你可以拿去直接用,我把iframe里的信息每隔一秒就赋值给那个input控件,则后面取值直接取input这个控件里的值就没有问题了,而后面是每一分钟自动保存一次,那个值可以自己设置的,以毫秒为单位,一秒等于1000毫秒,自己算吧。

第二个需要注意的问题就是在你发布成功的时候记得把草稿删除了,免得下次加载的时候还出来或和之前保存的冲突,这个用程序实现很简单,在你发布成功的时候判断一下就可以了,我的代码如下:

''--删除自动存稿--
        set fso = createobject("scripting.filesystemobject")
     dim filename1
     filename1=server.mappath("autosave.txt")
     If fso.FileExists(filename1) Then
        fso.deletefile(filename1)
     end if
     set fso = nothing
        ''--删除自动存稿--

我是用asp做的,如果你用C#写的话就一句代码就可以搞定,File.Delete就可以了

而当页面加载的时候还需要去判断一下草稿是否存在,如果存在的话则需要读出数据,我的方法如下:

Function ReadTxt(TxtPath)
Set objStream = CreateObject("adodb.stream")  
          EditFile=TxtPath  
          objStream.Type=2  
          objStream.Mode = 3  
          objStream.Charset = "utf-8"  ''可以改成gb2312
          objStream.Open  
          objStream.LoadFromFile Server.MapPath(EditFile)  
          ReadTxt = objStream.ReadText  
          objStream.Close  
Set objStream = Nothing
End Function

''--检测草稿箱里是否有未发布的草稿--
  filepath="autosave.txt"
  content=""
  Set fs = CreateObject("Scripting.FileSystemObject")   
  if fs.fileExists(Server.Mappath(filepath)) then                               
     content=ReadTxt(filepath)
  end if

判断如果草稿存在,则把草稿里的信息读取出来,放到content里,然后加载到编辑器里就行了。

总结:

为了写这篇文章我到现在还没有吃中午饭,呵呵,如果感觉这篇文章帮助到了你,不要忘了留言说声谢谢,有支持才有动力嘛,好了,如果在实现功能的时候遇到问题也可以留言咨询影子

自动保存草稿 asp+ajax自动存稿功能详解(转自影子)的更多相关文章

  1. DevExpress ASP.NET v18.2新功能详解(二)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...

  2. DevExpress ASP.NET v18.2新功能详解(四)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...

  3. DevExpress ASP.NET v18.2新功能详解(三)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...

  4. DevExpress ASP.NET v18.2新功能详解(一)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...

  5. 自己写了一个类似百度空间自动保存草稿的程序 php+jquery

    可以异步加载mysql中的草稿~,异步更新草稿列表~ 下载地址:http://download.csdn.net/source/3479156 代码: demo.php <?php mysql_ ...

  6. Linux命令-自动挂载文件/etc/fstab功能详解

    Linux命令-自动挂载文件etcfstab功能详解 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系 ...

  7. iBatis——自动生成DAO层接口提供操作函数(详解)

    iBatis——自动生成DAO层接口提供操作函数(详解) 在使用iBatis进行持久层管理时,发现在使用DAO层的updateByPrimaryKey.updateByPrimaryKeySelect ...

  8. 【转载】Linux命令-自动挂载文件/etc/fstab功能详解[转]

    博客园 首页 新随笔 联系 订阅 管理 随笔 - 322  文章 - 0  评论 - 19 Linux命令-自动挂载文件/etc/fstab功能详解[转]     一./etc/fstab文件的作用 ...

  9. 在ASP.NET 5应用程序中的跨域请求功能详解

    在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...

随机推荐

  1. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  2. 调试pcb板子的步骤

    在从外边焊回来的板子中查找问题的时候,如果只是简单的 一通乱调,很有可能一下子就调好了,但是大多数的时候是调了半天,不知道接下来该如何进行,因此,严格的按照步骤走,是个不错的想法: 1.拿到板子的第一 ...

  3. java属性的默认值

    String 默认null Boolean默认false int默认0 double默认0.0 类中使用自定义类定义属性默认值:null 在定义属性的时候可以指定默认值

  4. session 分布式处理-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest

    第一种:粘性session 粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话, ...

  5. Oracle 11.2.0.4.0安装

    http://opensgalaxy.com/2015/08/25/oracle11-2-0-4-0%E5%AE%89%E8%A3%85%E5%8F%8A%E8%A1%A5%E4%B8%81%E8%8 ...

  6. KonBoot – 只要5K映象文件轻易绕过您的WindowsXP/VISTA/7系统的密码

    http://pannisec.diandian.com/?tag=konBoot 这个东西是我昨晚点击了QQ弹窗的那个SOSO问题后,有人问我如何破解Windows登陆密码,且不可以用net命令创建 ...

  7. protobuf-net precompile

    之前游戏为了解决在ios自动更新的问题,想到使用了将游戏代码打包成dll,使用反射加载执行的办法.办法想好了以后,一直没有做测试.上周不知道什么原因,终于有人去测试了,结果发现报错了.我当时觉得有点意 ...

  8. NATS连线协议具体解释

    NATS连线协议具体解释 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs NATS的连线协议是一个简单的.基于文本的公布 ...

  9. leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  10. Redux 源码解读--createStore,js

    一.依赖:$$observable.ActionTypes.isPlainObject 二.接下来看到直接 export default 一个 createStore 函数,下面根据代码以及注释来分析 ...