自动更新作用


Posted in Javascript onOctober 08, 2006
function CLASS_AUTOUPDATE(instanceName,win) 
{ 
    this.instanceName    = instanceName; 
    this.updating        = false; 
    this.error            = false; 
    this.updateInfo        = ""; 
    this.nextVersion    = ""; 
    this.ver            = ""; 
    this.win            = win; 
    this.updatePath        = ""; 
    this.updateFileName = ""; 
    this.softName        = ""; 
    this.refresh(); } 
CLASS_AUTOUPDATE.prototype.onafterupdate = function() 
{ 
    var _window                = this.win; 
    var tempMessageWidth    = 360; 
    var tempMessageHeight    = 160; 
    var tempMessageLeft        = (document.body.clientWidth - tempMessageWidth) /2; 
    var tempMessageTop        = (document.body.clientHeight - tempMessageHeight) /2; 
    var feature = { 
        title:"更新完毕", 
        width:tempMessageWidth, 
        height:tempMessageHeight, 
        left:tempMessageLeft, 
        top:tempMessageTop, 
        borderColor:"#8B89A1", 
        backgroundColor:"#FFFFFF", 
        color:"#000000", 
        titleBackgroundColor:"#8B89A1", 
        titleColor:"#FFFFFF", 
        dragable:true 
    }; 
    var THIS = this; 
    var tempMessageContent    = []; 
    //tempMessageContent[tempMessageContent.length] = "<div style='font-size:12px;padding:5px'>"; 
    tempMessageContent[tempMessageContent.length] = this.updateInfo; 
    //tempMessageContent[tempMessageContent.length] = "<br/><br/>"; 
    tempMessageContent[tempMessageContent.length] = "<div align=center><span class='bt'><input type='button' value=' OK ' class='bt' id='bt_update_ok'></span></div>"; 
    tempMessageContent[tempMessageContent.length] = "</div>"; 
    _window.open("updateOk",feature); 
    _window.write("updateOk",tempMessageContent.join(""),false); 
    _window.items["updateOk"].all("bt_update_ok").onclick = function() 
                                                            {                                                                 
                                                                _window.close("updateOk");                                                                 
                                                            } 
    _window.items["updateOk"].onunload =    function() 
                                            {                                                 
                                                if(THIS.error==false&&THIS.updateFileList.length>0) 
                                                { 
                                                    document.location.reload(); 
                                                } 
                                            } 
} 
CLASS_AUTOUPDATE.prototype.check = function() 
{ 
    var _current_version,_new_version,_exist_new_ver; 

    //检查配置文件 
    var configXML = new CLASS_XML("xml\\autoupdate.xml"); 
    if(configXML.error==false) 
    { 
        var _update_date,_autoupdate_day,_current_version; 
        var _save_or_not; 
        var _d  = new Date(); 
        var _dd = _d.getFullYear() + "-" + (_d.getMonth()+1) + "-" + _d.getDate(); 
        //检查是否有更新时间段设置 
        if(configXML.selectSingleNode("/Config/UpdateDate")==null) 
        { 
            configXML.setText("/Config","UpdateDate", _dd); 
            _update_date = _dd; 
            _save_or_not = true; 
        } 
        else 
        { 
            _update_date = configXML.getText("/Config","UpdateDate", "1900-01-01"); 
        } 
        if(configXML.selectSingleNode("/Config/AutoUpdateDay")==null) 
        { 
            configXML.setText("/Config","AutoUpdateDay", "10"); 
            _autoupdate_day = "10"; 
            _save_or_not = true; 
        } 
        else 
        { 
            _autoupdate_day = configXML.getText("/Config","AutoUpdateDay", "10"); 
        } 
        _autoupdate_day = _autoupdate_day *1; 
        if(configXML.selectSingleNode("/Config/CurrentVersion")==null) 
        { 
            configXML.setText("/Config","CurrentVersion", "0.32"); 
            _current_version = "0.32"; 
            _save_or_not = true; 
        } 
        else 
        { 
            _current_version = configXML.getText("/Config","CurrentVersion", "0.32"); 
        } 
        _current_version = _current_version * 1; 

        //判断是否今天去连接服务器 
        var _od = new Date(_update_date.replace(/-/g, "\/")); 
        if(_d.getTime()-_od.getTime()>_autoupdate_day*24*3600*1000) 
        { 
            var newDoc        = new CLASS_XML(); 
                newDoc.loadRemoteFile(this.updatePath + this.softName + "/" + this.updateFileName);             
            if(newDoc.selectSingleNode("/Config/CurrentVersion")==null) 
            { 
                newDoc.setText("/Config","CurrentVersion", "0.32"); 
                _new_version = "0.32"; 
            } 
            else 
            { 
                _new_version = newDoc.getText("/Config","CurrentVersion", "0.32"); 
            } 
            _new_version = _new_version * 1; 
            //检查是否有新版本 
            if(_new_version>_current_version) 
            { 
                _exist_new_ver = true; 
            } 
            configXML.setText("/Config","UpdateDate",_dd); 
            _save_or_not = true; 
        } 
        if(_save_or_not) 
        { 
            configXML.save(); 
        } 
    } 
    if(_exist_new_ver) 
    { 
        var _window                = this.win; 
        var tempMessageWidth    = 260; 
        var tempMessageHeight    = 120; 
        var tempMessageLeft        = (document.body.clientWidth - tempMessageWidth) /2; 
        var tempMessageTop        = (document.body.clientHeight - tempMessageHeight) /2; 
        var feature = { 
            title:"升级", 
            width:tempMessageWidth, 
            height:tempMessageHeight, 
            left:tempMessageLeft, 
            top:tempMessageTop, 
            borderColor:"#8B89A1", 
            backgroundColor:"#FFFFFF", 
            color:"#000000", 
            titleBackgroundColor:"#8B89A1", 
            titleColor:"#FFFFFF", 
            dragable:true 
        }; 
        var THIS = this; 
        var tempMessageContent    = []; 
        //tempMessageContent[tempMessageContent.length] = "<div style='font-size:12px;padding:5px'>"; 
        tempMessageContent[tempMessageContent.length] = "<table width='100%' height='60' cellPadding='10'><tr><td valign='top'>有新版本,是否更新?<!--insert//--></td></tr></table>"; 
        //tempMessageContent[tempMessageContent.length] = "<br/><br/>"; 
        tempMessageContent[tempMessageContent.length] = "<div align=center><span class='bt'><input type='button' value=' Yes ' class='bt' id='bt_update_yes'></span>  <span class='bt'><input type='button' value=' No ' class='bt' id='bt_update_no'></span></div>"; 
        tempMessageContent[tempMessageContent.length] = "</div>"; 
        _window.open("update_or_not",feature); 
        _window.write("update_or_not",tempMessageContent.join(""),false); 
        THIS.ver = _current_version; 
        _window.items["update_or_not"].all("bt_update_yes").onclick = function() 
                                                                {         
                                                                    THIS.ver = _new_version; 
                                                                    _window.close("update_or_not"); 
                                                                    THIS.update(); 
                                                                } 
        _window.items["update_or_not"].all("bt_update_no").onclick = function() 
                                                                {         
                                                                    _window.close("update_or_not"); 
                                                                } 
        _window.items["update_or_not"].onunload =    function() 
                                                {                                                 
                                                } 
    } 

} 
CLASS_AUTOUPDATE.prototype.update = function() 
{ 
    this.updating    = !this.updating; 
    var t            = new Date(); 
    var THIS        = this; 
    if(this.error == false) 
    { 
    //得到新配置文档 
    var newDoc        = new CLASS_XML(); 
        newDoc.loadRemoteFile(this.updatePath + this.softName + "/" + this.updateFileName); 
        this.error = newDoc.error; 
        if(this.error) 
        { 
            THIS.updating    = false; 
            THIS.updateInfo    = "<table width='100%' height='100' cellPadding='10'><tr><td valign='top'>连接服务器失败<!--insert//--></td></tr></table>"; 
        } 
        else 
        { 
            var updateFileNodes = newDoc.selectNodes("//SystemFile"); 
            var updateInfoNode    = newDoc.selectSingleNode("//UpdateInfo"); 
            var nextVersion        = newDoc.selectSingleNode("//nextversion"); 
            if(updateInfoNode != null) 
            { 
                THIS.updateInfo = updateInfoNode.childNodes[0].text; 
            } 
            if(nextVersion != null) 
            { 
                THIS.nextVersion = nextVersion.childNodes[0].text; 
            } 
            THIS.updateFileList = [];             
            for(var i=0;i<updateFileNodes.length;i++) 
            { 
                var curUpdateFileName        = updateFileNodes[i].getAttribute("name").toLowerCase(); 
                var curUpdateFileVersion    = updateFileNodes[i].getAttribute("version").toLowerCase(); 
                var curUpdateFilePath        = updateFileNodes[i].getAttribute("path").toLowerCase(); 
                if(THIS.systemFiles[curUpdateFileName] == null || THIS.systemFiles[curUpdateFileName] != curUpdateFileVersion) 
                {                                     
                    //本地没有该文件或者版本号不一致 
                    THIS.updateFileList[THIS.updateFileList.length] =  
                    { 
                        name    :curUpdateFileName, 
                        version    :curUpdateFileVersion, 
                        path    :curUpdateFilePath, 
                        type    :"text" 
                    }; 
                } 
            } 
            newDoc.dispose(); 

            if(THIS.updateFileList.length == 0) 
            { 
                THIS.updating    = false; 
                THIS.updateInfo    = "<table width='100%' height='100' cellPadding='10'><tr><td valign='top'>没有需要更新的文件<!--insert//--></td></tr></table>"; 
            } 
            else 
            { 
                var configXML    = new CLASS_XML("xml\\autoupdate.xml"); 
                //添加更新信息 
                if(configXML.error==false&&THIS.updateInfo.length>0) 
                { 
                    var _updateInfo    = configXML.createElement("UpdateInfo"); 
                    var _cdata        = configXML.createCDATASection(THIS.updateInfo); 
                    _updateInfo        .appendChild(_cdata); 
                    configXML.root().appendChild(_updateInfo); 
                    //添加下版本预告 
                    var _nextVersion = configXML.selectSingleNode("//nextversion"); 
                    if( _nextVersion==null) 
                    { 
                        var __next = configXML.createElement("nextversion"); 
                        var __cdata= configXML.createCDATASection(THIS.nextVersion); 
                        __next.appendChild(__cdata); 
                        configXML.root().appendChild(__next); 
                    } 
                    else 
                    { 
                        if(_nextVersion.childNodes.length==0) 
                        { 
                            _nextVersion.appendChild(configXML.createCDATASection("")); 
                        } 
                        _nextVersion.childNodes[0].text = THIS.nextVersion; 
                    } 
                    configXML.setText("/Config","CurrentVersion",THIS.ver); 
                    configXML.save(); 
                } 
                configXML.dispose(); 
                THIS.updateFile(); 
            } 
        }             
    } 
    else 
    { 
        this.updateInfo = "<table width='100%' height='100' cellPadding='10'><tr><td valign='top'>加载配置文件失败!<!--insert//--></td></tr></table>"; 
    } 
    this.updating = false; 
    this.onafterupdate(); 
} 
CLASS_AUTOUPDATE.prototype.updateFile = function(curUpdateId) 
{ 
    var t        = new Date(); 
    var THIS    = this; 
    for(var i= 0;i<this.updateFileList.length;i++) 
    { 
        var curUpdateFile = this.updateFileList[i]; 
        if(curUpdateFile.type == "base64") 
        { 
            var url = this.updatePath  + this.softName + "/base64.aspx?src=" + curUpdateFile.name + "&t=" + t.valueOf(); 
        } 
        else if(curUpdateFile.type == "text") 
        { 
            var url = this.updatePath + this.softName + "/" + curUpdateFile.path + "/" + curUpdateFile.name; 
        } 
        //下载文件 
        var errors     = this.downloadFile(url,curUpdateFile.path,curUpdateFile.name); 
        if(this.error==false) 
        { 
            //记录当前版本信息                     
            var configXML    = new CLASS_XML("xml\\autoupdate.xml"); 
            if(configXML.error==false) 
            { 
                var systemFiles = configXML.selectSingleNode("//SystemFiles"); 
                if(systemFiles    == null) 
                { 
                    systemFiles = configXML.createElement("SystemFiles"); 
                    configXML.selectSingleNode("/Config").appendChild(systemFiles); 
                } 
                var systemFile    = configXML.selectSingleNode("//SystemFiles/SystemFile[@name='" + curUpdateFile.name.toLowerCase() + "']"); 
                if(systemFile    == null) 
                { 
                    systemFile    = configXML.createElement("SystemFile"); 
                    systemFile.setAttribute("name",curUpdateFile.name.toLowerCase()); 
                    systemFile.setAttribute("path",curUpdateFile.path.toLowerCase()); 
                    configXML.selectSingleNode("//SystemFiles").appendChild(systemFile); 
                } 
                systemFile.setAttribute("version",curUpdateFile.version); 
                configXML.save(); 
                configXML.dispose(); 
                this.error         = false; 
                this.updateInfo += errors + "\n"; 
            } 
            else 
            { 
                this.updateInfo += "<table width='100%' height='100' cellPadding='10'><tr><td valign='top'>加载配置文件出错!<!--insert//--></td></tr></table>"; 
            } 
        } 
    } 
} 
CLASS_AUTOUPDATE.prototype.downloadFile = function(url,path,filename) 
{ 
    try 
    { 
        var xmlHTTP    =    new ActiveXObject("Microsoft.XMLHTTP"); 
            xmlHTTP.open("Get",url,false); 
            xmlHTTP.send(); 
        if(xmlHTTP.readyState==4&&xmlHTTP.status==200) 
        { 
            var adodbStream = new ActiveXObject("ADODB" + "." + "Stream"); 
            //判断目录是否存在,不存在则创建 
            this.buildPath(path); 
            var strLocalURL = path.length>0?path + "\\" +filename:filename; 
            //1=adTypeBinary 
            adodbStream.Type= 1;         
            adodbStream.Open(); 
            adodbStream.write(xmlHTTP.responseBody); 
            adodbStream.SaveToFile(strLocalURL,2); 
            adodbStream.Close(); 
            adodbStream        = null; 
            xmlHTTP            = null; 
        } 
        else 
        { 
            this.error        = true; 
            return    filename + "下载失败"; 
        } 
        return ""; 
    } 
    catch(e) 
    { 
        this.error        = true; 
        return    e.description; 
    } 
} 
CLASS_AUTOUPDATE.prototype.refresh = function() 
{ 
    var configXML = new CLASS_XML("xml\\autoupdate.xml"); 
    if(configXML.error==false) 
    { 
        var _softName        = configXML.selectSingleNode ("/Config/SoftName"); 
        var _updatePath        = configXML.selectSingleNode ("/Config/UpdatePath"); 
        var _updateFileName    = configXML.selectSingleNode ("/Config/UpdateFileName"); 
        this.updatePath        = _updatePath     !=null?_updatePath.text    :"http://dooit.3322.org/"; 
        this.softName        = _softName         !=null?_softName.text        :"cc"; 
        this.updateFileName = _updateFileName!=null?_updateFileName.text:"autoupdate.xml"; 
        this.systemFiles = {}; 
        var tempSystemFileNodes = configXML.selectNodes("/Config/SystemFiles/SystemFile"); 
        for(var i=0;i<tempSystemFileNodes.length;i++) 
        { 
            this.systemFiles[tempSystemFileNodes[i].getAttribute("name")] = tempSystemFileNodes[i].getAttribute("version"); 
        } 
    } 
    else 
    { 
        this.error = true; 
    } 
    configXML.dispose();     
} 
CLASS_AUTOUPDATE.prototype.buildPath = function(path) 
{ 
    var _baseUrl    = unescape(document.location.href.substring(document.location.href.lastIndexOf("/")+1,-1)).replace(/^file\:\/\/\//i,"").replace(/\//g,"\\"); 
    var _path        = path.replace(/^\s*|\s*$/g,""); 
    var _fullPath    = ""; 
    //得到全路径 
    if(/^\w\:\\/.test(_path) == false){ 
        _fullPath = _baseUrl + _path; 
    }else{ 
        _fullPath = _path; 
    } 
    var p    = _fullPath.split(/\\|\//g); 
    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var t    = ""; 
    for(var i=0;i<p.length;i++){ 
        t += p[i] + "\\"; 
        try 
        { 
            if(!fso.FolderExists(t)) 
            { 
                fso.CreateFolder(t); 
            } 
        } 
        catch(e) 
        { 
            return false; 
        } 
    } 
    return true; 
}
Javascript 相关文章推荐
Javascript实现的分页函数
Dec 22 Javascript
javascript 对象的定义方法
Jan 10 Javascript
解决jQuery插件tipswindown与hintbox冲突
Nov 05 Javascript
简单实用jquery版三级联动select示例
Jul 04 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
javascript创建createXmlHttpRequest对象示例代码
Feb 10 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
JavaScript 数组的进化与性能分析
Sep 18 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
基于vue-cli3和element实现登陆页面
Nov 13 Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 Javascript
许愿墙中用到的函数
Oct 07 #Javascript
解放web程序员的输入验证
Oct 06 #Javascript
通过ifame指向的页面高度调整iframe的高度
Oct 05 #Javascript
javascript字典探测用户名工具
Oct 05 #Javascript
TFDN图片播放器 不错自动播放
Oct 03 #Javascript
DOM精简教程
Oct 03 #Javascript
JavaScript去除空格的几种方法
Oct 03 #Javascript
You might like
php intval的测试代码发现问题
2008/07/27 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
解析crontab php自动运行的方法
2013/06/24 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
Python微信公众号开发平台
2018/01/25 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
Linux机考试题
2015/10/16 面试题
《盲人摸象》教学反思
2014/02/16 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
中秋节随笔
2015/08/15 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
springcloud之Feign超时问题的解决
2021/06/24 Java/Android