自动更新作用


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 相关文章推荐
对象的类型:本地对象(1)
Dec 29 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
在JavaScript中处理时间之getHours()方法的使用
Jun 10 Javascript
js判断当前页面用什么浏览器打开的方法
Jan 06 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
微信小程序 input输入框详解及简单实例
Jan 10 Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 Javascript
详解vue2.0模拟后台json数据
May 16 Javascript
小程序Request的另类用法详解
Aug 09 Javascript
vue element实现表格合并行数据
Nov 30 Vue.js
许愿墙中用到的函数
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计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
js实现简单数字变动效果
2017/11/06 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python threading的使用方法解析
2019/08/28 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
人民调解协议书范本
2014/10/11 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
小学教师节活动总结
2015/03/20 职场文书
跳高加油稿
2015/07/21 职场文书
安全生产会议制度
2015/08/06 职场文书