必知:所有需要处理的HTML元素必须具有ID属性,组件只会探测元素的ID属性

1. 在</Head>上加入
<STYLE>
   .userData {behavior:url(#default#userdata);}
</STYLE>  

2. 在<body>下加入
<INPUT type=text class=userData id=OfflineSave_Area style="display:none">

3. 在</body>上加入
<script src=OfflineSave.js></script>

4. 为form标签加入扩展属性OfflineSave
例:<form id=myOfflineSaveForm OfflineSave ToolsBarStyle="mycssclass">
ToolsBarStyle为css class属性,容器为div,包含select,input,button

注意:
情况1:
<form id=myform onsubmit="docheck(this)">
<input type=text id=mytext>
<input type=submit value=submit> 
</form> 
在这种情况下,组件可以自动探测服务器存活状态,如服务器无法连接时,会提示本地保存,
并且docheck函数也可以正常工作

情况2:
<form id=myform >
<input type=text id=mytext>
<input type=button value=submit onclick="myform.submit()">
</form>
在这种情况下,组件无法截获提交事件,也无法自动探测服务器存活状态

建议:检测表单内数据时,在form标签onsubmit事件内写入检测函数

联系我:qq:13872888  注明:blueidea
实现代码如下:

var os_Obj,os_usd;

var os_dg=document.getElementById;
var os_ButtonCss="style=\"cursor:hand;height:20px;padding:0px 3px;border:1px solid #67C1E4;\"";
var os_SelectCss="style=\"font-size:12px;\"";
var os_SaveSuccessStr="离线数据保存成功!";
var os_SaveProStr="请输入离线保存的名称:(如为空则用当前时间表示)";
var os_LoadProStr="确认要载入离线数据吗?";
var os_DelProStr="确认要删除离线数据吗?";
var os_DelSuccessStr="离线数据删除成功!";
var os_oUD="OfflineSave_oPersistInput";
var os_DefaultFiledLength=10;//Default Filed length
var os_str="OfflineSave_";
var os_CannotSaveStr="保存数据时出现错误![离线保存空间仅限640K]\n\n有可能已超出离线保存容量!请删除部分数据后再保存!";
var os_expires = (new Date(2010,1,1)).toUTCString();


InitOfflineSave();
function InitOfflineSave(){
    for(var i=0;i<document.forms.length;i++){
        if(document.forms[i].OfflineSave!=null){
            os_usd=os_dg("OfflineSave_Area");
            var tbs=document.forms[i].ToolsBarStyle==null?"":document.forms[i].ToolsBarStyle;
            os_CreateToolBar(document.forms[i],tbs);
            os_GetOfflineSaveList(document.forms[i].id);
            var cmd=document.forms[i].onsubmit==null?"":document.forms[i].onsubmit;
            if(cmd!=""){
                cmd=document.forms[i].onsubmit+"";
                cmd=cmd.split("{")[1].split("}")[0].replace("\n","");
            }
            cmd=escape(cmd);
            eval("document.forms[i].onsubmit=function(){return os_CheckSubmit('"+document.forms[i].id+"','"+cmd+"');}");
            break;
        }
    }
}

function os_CreateToolBar(obj,boolbarstyle){
    var hc;
    hc="<div id='os_"+obj.id+"_div'><select id='os_"+obj.id+"_Select' "+os_SelectCss+">";
    hc+="</select>";
    hc+=" ";
    hc+="<input type=button "+os_ButtonCss+" value=载入 onclick=\"os_LoadData('"+obj.id+"');\">";
    hc+=" ";
    hc+="<input type=button "+os_ButtonCss+" value=删除 onclick=\"os_DelData('"+obj.id+"');\">";
    hc+="  ";
    hc+="<input type=button "+os_ButtonCss+" value=离线保存 onclick=\"os_SaveData('"+obj.id+"');\"></div>";
    obj.innerHTML=hc+obj.innerHTML;
    if(boolbarstyle==""){
        os_dg("os_"+obj.id+"_div").style.textAlign     = "left";
        os_dg("os_"+obj.id+"_div").style.textvAlign     = "middle";
        os_dg("os_"+obj.id+"_div").style.paddingTop     = "3";
        os_dg("os_"+obj.id+"_div").style.height     = "30";
        os_dg("os_"+obj.id+"_div").style.border     = "1 solid black";
        os_dg("os_"+obj.id+"_div").style.paddingLeft     = "5";
    }
    else
        os_dg("os_"+obj.id+"_div").className=boolbarstyle;
}

function os_CheckSubmit(id,subfunc){
    if(!os_CanSubmit(os_dg(id).action)){
        if(confirm("离线保存提示:\n\n您要提交的服务器连接可能出现问题,是否进行离线保存?")){
            os_SaveData(id);
        }
        return false;
    }
    eval(unescape(subfunc));    
}

function os_LoadData(id){
    var v=os_dg("os_"+id+"_Select").selectedIndex;
    if(v==0)    return;

    var ud=os_str+id+os_dg(id).length;
    if(confirm(os_LoadProStr+"\n\n记录名称:"+os_getUserData(ud,"f_"+v+"_os_savename")+"\n保存时间:"+os_getUserData(ud,"f_"+v+"_os_savedate"))){
        var lcount=os_dg(id).length;
        for(var i=0;i<lcount;i++){
            if(os_dg(id).item(i).type!="submit"&&os_dg(id).item(i).type!="reset"&&os_dg(id).item(i).type!="button"&&os_dg(id).item(i).id!="os_"+id+"_Select"){
                if(os_dg(id).item(i).type=="radio"||os_dg(id).item(i).type=="checkbox")
                    os_dg(os_dg(id).item(i).id).checked=os_getUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id)=="1"?true:false;
                else{
                    if(os_dg(id).item(i).type=="select-multiple"){
                        var sm=os_getUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id).split(",");
                        var x;
                        for(x=0;x<os_dg(id).item(i).length;x++)
                            os_dg(id).item(i).options[x].selected=false;
                        for(x=0;x<sm.length-1;x++)
                            os_dg(id).item(i).options[parseInt(sm[x])].selected=true;
                    }
                    else{
                        if(os_dg(id).item(i).type=="select-one")
                            os_dg(os_dg(id).item(i).id).selectedIndex=parseInt(os_getUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id));
                        else{
                            //alert(os_getUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id));
                            os_dg(os_dg(id).item(i).id).value=unescape(os_getUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id));
                        }
                    }
                }
            }
        }
    }
}

function os_DelData(id){
    var v=os_dg("os_"+id+"_Select").selectedIndex;
    if(v==0)    return;

    var ud=os_str+id+os_dg(id).length;
    if(confirm(os_DelProStr+"\n\n记录名称:"+os_getUserData(ud,"f_"+v+"_os_savename")+"\n保存时间:"+os_getUserData(ud,"f_"+v+"_os_savedate"))){
        var i=0;
        var ud=os_str+id+os_dg(id).length;
        var lcount=parseInt(os_getUserData(ud,"count"));

        var vcount=os_dg(id).length;
        for(i=0;i<vcount;i++){
            if(os_dg(id).item(i).type!="button"&&os_dg(id).item(i).id!="os_"+id+"_Select")
                if(v<lcount)
                    os_putUserData(ud,"f_"+v+"_"+os_dg(id).item(i).id,os_getUserData(ud,"f_"+lcount+"_"+os_dg(id).item(i).id));
                os_remUserData(ud,"f_"+lcount+"_"+os_dg(id).item(i).id);
        }
        if(v<lcount){
            os_putUserData(ud,"f_"+v+"_os_savename",os_getUserData(ud,"f_"+lcount+"_os_savename"));
            os_putUserData(ud,"f_"+v+"_os_savedate",os_getUserData(ud,"f_"+lcount+"_os_savedate"));
        }
        os_remUserData(ud,"f_"+lcount+"_os_savename");
        os_remUserData(ud,"f_"+lcount+"_os_savedate");

        eval("os_putUserData(ud,\"count\",\""+(lcount-1)+"\");");

        var s=os_dg("os_"+id+"_Select");
        if(lcount==1){
            os_delUserData(ud);
            while (s.length>0) s.remove(0);
            s.add(new Option("无数据",0));            
        }
        else{
            s.item(0).text="共有"+(lcount-1)+"个记录";
            if(v<s.length){
                s.item(0).value=0;
                s.item(v).text=s.item(s.length-1).text;
            }
            s.remove(s.length-1);            
        }
        alert(os_DelSuccessStr);
    }
}

function os_SaveData(id){
    if(os_dg(id).length<=0){
        alert("[OfflineSave]Error:\n\n"+id+" no Element!(input,radio,checkbox,select)");
        return;
    }

    var sd=new Date();
    var sn=prompt(os_SaveProStr,sd.toLocaleString()+":MyData");
    var ud=os_str+id+os_dg(id).length;
    var lcount=os_getUserData(ud,"count");
    lcount=lcount==""||lcount==null?1:parseInt(lcount)+1;
    if(os_dg(id).length*10*2*lcount>64000){
        alert(os_CannotSaveStr);
        return;
    }
    try{

    sn=sn==""?sd.toLocaleString():sn;

    var vcount=os_dg(id).length;
    for(var i=0;i<vcount;i++){
        if(os_dg(id).item(i).type!="submit"&&os_dg(id).item(i).type!="reset"&&os_dg(id).item(i).type!="button"&&os_dg(id).item(i).id!="os_"+id+"_Select"){
            if(os_dg(id).item(i).type=="radio"||os_dg(id).item(i).type=="checkbox"){
                eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_"+os_dg(id).item(i).id+"\",\""+(os_dg(id).item(i).checked?"1":"0")+"\");");
            }
            else{
                if(os_dg(id).item(i).type=="select-multiple"){
                    var mc="";
                    for(var x=0;x<os_dg(id).item(i).length;x++){
                        if(os_dg(id).item(i).options[x].selected)    mc+=x+",";
                    }    
                    eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_"+os_dg(id).item(i).id+"\",\""+mc+"\");");
                }
                else{
                    if(os_dg(id).item(i).type=="select-one")
                        eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_"+os_dg(id).item(i).id+"\",\""+os_dg(id).item(i).selectedIndex+"\");");
                    else
                        eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_"+os_dg(id).item(i).id+"\",\""+escape(os_dg(id).item(i).value)+"\");");
                }
            }
        }
    }
    eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_os_savename\",\""+sn+"\");");
    eval("os_putUserData(\""+ud+"\",\"f_"+lcount+"_os_savedate\",\""+sd.toLocaleString()+"\");");
    eval("os_putUserData(ud,\"count\",\""+lcount+"\");");//save list count
    var s=os_dg("os_"+id+"_Select");
    s.item(0).text="共有"+lcount+"个记录";
    s.item(0).value=0;
    s.add(new Option(sn,lcount));
    alert(os_SaveSuccessStr);
    }
    catch(e){
        alert(os_CannotSaveStr+"\n\n错误原因:"+e);
    }
}

function os_GetOfflineSaveList(id){
    var ud=os_str+id+os_dg(id).length;
    var s=os_dg("os_"+id+"_Select");
    var lcount=os_getUserData(ud,"count");
    var sv="";
    while (s.length>0) s.remove(0);
    lcount=lcount==""||lcount==null?0:parseInt(lcount);
    if(lcount<=0)
        s.add(new Option("无数据","0"));
    else{
        s.add(new Option("共有"+lcount+"个记录","0"));
        for(var i=1;i<=lcount;i++){
            eval("sv=os_getUserData(ud,\"f_"+i+"_os_savename\");");
            s.add(new Option(sv,i));    
        }
    }
}

function os_putUserData(sUDName,sName,sVal) {
  os_usd.load(sUDName);
  os_usd.expires = os_expires;
  os_usd.setAttribute(sName,sVal);
  os_usd.save(sUDName);
  return;
}

function os_remUserData(sUDName,sName) {
  os_usd.load(sUDName);
  os_usd.removeAttribute(sName);
  os_usd.save(sUDName);
  return;
}

function os_getUserData(sUDName,sName) {
  os_usd.load(sUDName);
  return os_usd.getAttribute(sName);
}

function os_delUserData(sUDName){
  var oTimeNow = new Date(); // Start Time
  oTimeNow.setMinutes(oTimeNow.getMinutes()+1);
  var sExpirationDate = oTimeNow.toUTCString();
  os_usd.load(sUDName);
  os_usd.expires = sExpirationDate;
  os_usd.save(sUDName);
  return;
}

function os_CanSubmit(url){
    var xmlHTTP = window.ActiveXObject? new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();
    xmlHTTP.open("get",url,false);
    xmlHTTP.send("");
    return xmlHTTP.status=="200";
}

OfflineSave.htm
实现代码如下:

<html>
    <head>
        <title>离线保存</title>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
        <STYLE> .userData {behavior:url(#default#userdata);}
    </STYLE>
        <link href="css.css" rel="stylesheet" type="text/css">
    </head>
    <body>
        <INPUT type="text" class="userData" id="OfflineSave_Area" style="DISPLAY:none">
        <table width="100%" border="0" cellpadding="0" cellspacing="0" style="FONT-SIZE:12px">
            <tr>
                <td height="78" colspan="3" valign="top"><font size="4" color="red">Ajax演示程序(J2EE)</font>
                    <BR>
                    <BR>
                    服务端:<b>JDK1.4 TomCAT4.1 Hibernate3 MSSQL Server2000(SP4) DWR1.0</b><BR>
                    客户端:<b>JavaScript(CallBack) VML </b>
                    <BR>
                    编写人:富深协通常州研发中心 姜泉</td>
            </tr>
            <tr>
                <td colspan="3"><BR>
                    <table border="1" class="listView" width="100%">
                        <Caption>
                            离线数据保存(仅限IE浏览器5.0版本以上)</Caption>
                        <tbody>
                            <tr>
                                <td><form id="myOfflineSaveForm" action="J2EE_AJAX.html" onsubmit="alert('这是在HTML页面中的onsubmit事件中执行的函数!');" OfflineSave>
                                        <table cellSpacing="0" cellPadding="2" width="100%" border="1">
                                            <TR>
                                                <TD>名称<input type="text" id="name" size="5">
                                                </TD>
                                                <TD>公司全称<TEXTAREA id="gsqc" name="gsqc" rows="2" cols="20">
                                                    </TEXTAREA></TD>
                                                <TD>客户代码<INPUT id="dm" type="checkbox" name="dm"></TD>
                                            </TR>
                                            <tr>
                                                <TD>分类<SELECT id="fl" name="fl">
                                                        <OPTION selected>中国人</OPTION>
                                                        <OPTION>外星人</OPTION>
                                                        <OPTION>山西人</OPTION>
                                                    </SELECT></TD>
                                                <TD>性别<INPUT id="cz" type="radio" value="cz" checked name="RadioGroup">男<INPUT id="cz1" type="radio" value="cz1" name="RadioGroup">女</TD>
                                                <TD>增加日期<SELECT id="rq" size="4" name="rq" multiple>
                                                        <OPTION>2000年</OPTION>
                                                        <OPTION>2003年</OPTION>
                                                        <OPTION>2004年</OPTION>
                                                        <OPTION>2005年</OPTION>
                                                    </SELECT></TD>
                                            </tr>
                                        </table><input type=submit value=submit >
                                    </form>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </table>

        <script src="OfflineSave.js"></script>
    </body>
</html>

以上就是【OfflineSave离线保存代码再次发布使用说明】的全部内容了,欢迎留言评论进行交流!

赞(0) 踩(0)
发表我的评论

最新评论

  1. 暂无评论