//复制一条host规则
function copyRule(div){
    var d = div.cloneNode(true);
    var ar = gvar.arr;
    ar.push(ar[d.getAttribute("idx")]);
    d.setAttribute("idx",ar.length-1);
    d.style.border = "1px solid #B3C1D2";
    ns.divMain.appendChild(d);
    d.onmouseover=function(){this.style.border = "1px solid #97A7BB";};
    d.onmouseout =function(){this.style.border = "1px solid #B3C1D2";};
    save();
    event.returnValue = false;
    return false;
}
//删除一条host规则
function delHostRule(div){
    if(!confirm("确定要删除吗?")) return false;
    var idx = parseInt(div.getAttribute("idx"),10);
    gvar.arr[idx] = "";
    ns.divMain.removeChild(div);
    saveHostsFile();
    event.returnValue = false;
    return false;
}
//在新窗口中打开域名地址
function openDomain(div){
    var url = "http://"+div.getElementsByTagName("input")[2].value;
    if(ns.chkCache.checked == true) clearCache();
    if(ns.chkComment.checked==true){
        var val = div.getElementsByTagName("input")[3].value;
        url += (val.charAt(0) == "/" ? val : "/" + val);
    }
    window.open(url,(Math.random()+"").replace(/^0\./,"win"));
    event.returnValue = false;
    return false;
}
//读取host文件
function readFile(){
    gvar.text = read();
    gvar.arr = gvar.text.split(/\n/);
}
function read(){
    if (!gvar.fso.FileExists(gvar.hostpath)){
        alert(gvar.hostpath+"文件不存在.\n请选择要编辑的hosts文件!");
        gvar.hostpath = "";
        ns.fPath.click();
    }
    if(gvar.hostpath == ""){ alert("您没有选择任何Hosts文件"); return ""; }
    var file = gvar.fso.GetFile(gvar.hostpath);
    var ts = gvar.fso.OpenTextFile(gvar.hostpath, 1);
    var text = (file.Size>0?ts.ReadAll():"").replace(/ /g," ").replace(/\r(\n)/g,"$1").replace(/\r/g,"\n");
    ts.close();
    return text;
}
function addStyle(ref){
    ref.onmouseover = function (){ this.style.color = "#FF2A00"; this.style.backgroundColor = "#bbcada"};
    ref.onmouseout = function (){ this.style.color = "#3E3E3E"; this.style.backgroundColor = "#B3C1D2"};
}
//在可视化编辑和手动编辑之间切换函数
function show(btn){
    var f = {
        "View":function(b){ns.divContent.style.display = "block"; ns.taContent.value = read(); b.value = "Edit"; ns.btnSave.style.display = "";},
        "Edit":function(b){ns.divContent.style.display = "none"; b.value = "View"; ns.btnSave.style.display = "none"; if(gvar.isEverSaved) window.location.reload();}
    };
    f[btn.value](btn);
}
//为DOM元素注册事件
function addEvtListener(){
    ns.fPath.onchange = function(){gvar.hostpath = this.value;};
    addStyle(ns.btnShowView);
    addStyle(ns.btnClose);
    addStyle(ns.btnClearCache);
    ns.btnClose.onclick = function(){window.opener=null; window.close();};
    ns.btnClearCache.onclick = clearCache;
    ns.btnShowView.onclick = function(){ show(this); };
    ns.btnSave.onclick = function (){ wrFile(ns.taContent.value);gvar.isEverSaved=true;};
    ns.spIP.onclick=function(){sort(gvar.divRules,funcond ,1)};
    ns.spDomain.onclick=function(){sort(gvar.divRules,funcond ,2)};
}
//遍历缓存文件夹,清除缓存函数
function clearCache(){
    traverse(gvar.cachepath,function(f){return /^[\s\S]+\.js$/.test(f.Name);},function(f){try{gvar.fso.DeleteFile(f.Path);}catch(e){} });
}
function traverse(path,cond,exe){
    var fso = gvar.fso;
    if (!fso.FolderExists(path)){
        alert("浏览器缓存文件夹不存在!\n" + path); 
        return;
    }
var f = fso.GetFolder(path);
traverseFolder(f,cond,exe);
}
function traverseFolder(folder,cond,exe){
var fc = new Enumerator(folder.SubFolders);
for (;!fc.atEnd(); fc.moveNext())
traverseFolder(fc.item(),cond,exe);
fc = new Enumerator(folder.files);
for (; !fc.atEnd(); fc.moveNext())
if(cond(fc.item())) exe(fc.item());
}
//初始化
function init(){
    getElementRef();
    initGvar();
    initwindow();
    if (!gvar.fso.FileExists(gvar.hostpath) || !gvar.fso.FolderExists(gvar.cachepath)){
        help();
        alert("您还没有配置本软件的参数,或者配置参数不正确.\n请查看帮助文档的\"如何配置该软件\"部分!");
        return;
    }
    addEvtListener();
    readFile();
    initDom();
    //sort(gvar.divRules,funcond ,2);
}
//排序函数
function sort(els,fc,flag){
    var l = els.length;
    for(var i=0;i<l-1;i++){
        for(var j=i+1;j<l;j++){
            if(fc(els[i],els[j],flag)>0){
                swap(els[i],els[j]);
                var t = els[i];
                els[i]=els[j];
                els[j]=t;
            }
        }
    }
}
function compare(x,y,f){
    if(f==1){//IP
c = x.replace(/(^|\D)(\d)(?=(\D|$))/g,"$1"+"00$2").replace(/(^|\D)(\d\d)(?=(\D|$))/g,"$1"+"0$2");
d = y.replace(/(^|\D)(\d)(?=(\D|$))/g,"$1"+"00$2").replace(/(^|\D)(\d\d)(?=(\D|$))/g,"$1"+"0$2");
return (c>d?1:(c<d?-1:0));
    }else if(f==2){//domain
return (x>y?1:(x<y?-1:0));
    }else{//error
return "error";
    }
}
function swap(a,b){
    a.swapNode(b);
}
function funcond(a,b,f){
    return compare(a.getElementsByTagName("input")[f].value,b.getElementsByTagName("input")[f].value,f);
}function free(){}window.onload=init;
window.onbeforeunload = free;
window.onhelp = function help(){
    if(ns.divHelp.style.display == "block"){
        ns.divHelp.style.display = "none";
        ns.divMain.style.display = "block";
    }
    else{
        ns.divHelp.style.display = "block";
        ns.divMain.style.display = "none";
    }
}
//未完成功能:
// 实现升序降序交替排序
// 手动编辑的textarea 加上行号
// 操作成功失败提示
// 清缓存功能扩展: 支持删除其它后缀名的缓存
// 备份功能
// 释放内存
//-->
</script>

解决方案 »

  1.   

    <body>
    <div id="divMain">
        <div id="divHead"><span class="sp1">#</span><span id="spIP" title="按IP排序" class="sp2">IP</span><span id="spDomain" title="按域名排序" class="sp3">domain</span><span class="sp4">comment</span></div>
        <div id="divContent"><textarea id="taContent"></textarea></div>
    </div>
    <hr class="split">
    <div id="divBottom">
        <span class="left">
            <span title="打开链接时清除缓存"><input type="checkbox" id="chkCache" hidefocus="true">自动清除缓存</span>
            <span class="fgf">|</span>
            <span title="将域名和注释连接成完整地址"><input type="checkbox" id="chkComment" checked="true" hidefocus="true">连接域名注释</span>
        </span>
        <span class="right">
        <button hidefocus="true" id="btnClearCache" title="清除缓存中的js文件">Cache</button>
        <button hidefocus="true" id="btnSave" title="保存Hosts文件" style="display:none">Save</button>
        <button hidefocus="true" id="btnShowView" title="查看Hosts文件">View</button>
        <button hidefocus="true" id="btnClose" title="关闭窗口">Close</button>
        <a href="mailto:[email protected]" title="Report BUG" title="报告bug">Bug</a></span>
    </div>
    <input type="file" id="fPath">
    <a href="#" onclick="help()" id="lnkHelp">帮助</a>
    <div id="divHelp">
    <pre>
    作 者 : 梅雪香
    版 本 : 1.0
    日 期 : 2007-9-18
    Email : <a href="mailto:[email protected]" title="Report BUG" title="报告bug">[email protected]</a>
    <hr>
    <p align="center" style="color:red">按下 <b>F1</b> 可以关闭/打开该帮助文档</p>
    <b>软件功能:</b>
        1.修改本机host文件.
        2.删除本机浏览器的指定类型缓存文件(目前只删除.js文件).
        3.打开域名页面.
    <b>谁可以使用该软件:</b>
        如果你需要经常的修改host文件,删除某些缓存文件,浏览各种环境下的同一域名地址,那么本软件可以帮到您.
    <b>如何配置该软件:</b>
        本程序无法自动搜索您本机的host文件地址和缓存文件夹,需要您手动配置.
        <b>修改host文件路径:</b>
            用文本编辑器(如:记事本,editplus,ultraedit等)打开本程序hosteditor.hta,找到
            gvar.hostpath = "c:\\windows\\system32\\drivers\\etc\\hosts";
            如上语句,将您本机的host文件地址替换到双引号中,注意使用"\\"来分隔各文件夹名.
        <b>修改缓存文件路径:</b>
            与修改host类似,对应的语句为:
            gvar.cachepath= "C:\\Documents and Settings\\meixx\\Local Settings\\Temporary Internet Files"
    <b>如何使用该软件:</b>
        如果你已经正确配置了该软件所需要的两个地址,那么你可以开始使用本软件了.
        软件打开的界面会显示出host文件中生效的和被注释掉的所有host规则.在本界面进行的操作不需要手动保存,程序会自动保存.
        <b>使某条规则生效:</b>
            取消该条规则前边复选框的选中状态.
        <b>修改IP地址,域名:</b>
            在对应的文本框中进行修改.
        <b>添加或修改注释:</b>
            在注释文本框中添加内容,不需要加#号.在host文件中,该注释会显示在本条规则同一行的后部.
        <b>添加一条新规则:</b>
            本软件并没有添加新规则的按钮,您可以通过点击已有规则后边的 "C" 链接来复制一条当前规则,
            并在此基础上修改来达到添加的目的.
            当host文件中没有任何规则的时候,需要手动在此文件添加至少一条规则,然后才能使用复制功能.
            您可以用其它编辑器添加一条规则,也可以用本软件的手动编辑功能来添加一条规则,添加方法见后面介绍.
        <b>删除一条规则:</b>
            点击规则后边的 "X"链接,并选择弹出框中的确定,可以删除当前规则.
        <b>打开域名对应的地址:</b>
            点击规则后边的 "O"链接,可以打开当前域名对应的http协议地址.
            如果选中了"连接域名注释"复选框,则会把注释的内容当做路径添加到URL后边.
            如果选中了"自动清除缓存"复选框,程序会自动清除浏览器缓存中的指定后缀名的文件(暂时只删除.js文件).
        <b>清除缓存:</b>
            页面右下方的cache按钮用来清除浏览器缓存中的指定后缀名的文件(暂时只删除.js文件).
            本操作可能耗时较长.时间取决于缓存文件的数量.
        <b>手工编辑host文件:</b>
            点击页面右下方的View按钮,程序会显示出host文件当前的内容,你可以手动编辑此内容,并通过点击Save按钮保存您的修改,
            或者点击Edit按钮回到编辑页面并放弃修改.
        <b>关闭窗口:</b>
            页面右下方的close按钮可以用来关闭窗口.也可以点击右上角的X(关闭)按钮,或者在任务栏用右键关闭,或者按Alt+F4键.
        <b>辅助功能:</b>
            默认情况下,编辑页面不对规则进行任何排序,您可以通过点击页面上方的文字"IP"将规则按IP由小到大的顺序排列.
            或者点击domain将规则按域名由小到大的顺序排列.
    </pre>
    </div>
    </body>
    </html>
      

  2.   

    小小说明: 以上代码保存成 HostEditor.hta 在windows环境下直接运行.
    其它参见代码后边的简单的帮助文档. 有任何建议或者意见,或者有什么不明白的请在此回贴.
      

  3.   

    小梅最近写HTA程序比较多啊。
    顶+学习
      

  4.   

    支持,这个hta是什么文件格式,以前没见过 ,请教?
      

  5.   

    hta格式到google搜一下就知道了学习ing
      

  6.   

    hta不懂
    来看看
    顺便接分
    顺便祝大家和自己长假快乐!
      

  7.   

    好像得转到view里才能插入一条新的host记录啊...
      

  8.   

    <b>添加一条新规则:</b>
            本软件并没有添加新规则的按钮,您可以通过点击已有规则后边的 "C" 链接来复制一条当前规则,
            并在此基础上修改来达到添加的目的.
            当host文件中没有任何规则的时候,需要手动在此文件添加至少一条规则,然后才能使用复制功能.
            您可以用其它编辑器添加一条规则,也可以用本软件的手动编辑功能来添加一条规则,添加方法见后面介绍.
      

  9.   

    牛人,真的厉害,不过也只有做成hta格式才能实现这些吗?
    ---------------------------------------------
    XPaint:专业的WEB图象处理(http://www.crossgo.com)
      

  10.   

    hsnd 
    34 
    等 级:
     发表于:2007-09-29 12:40:2132楼 得分:0 
    牛人,真的厉害,不过也只有做成hta格式才能实现这些吗?  
    =================貌似||会被替换================
    htm也是可以的,不过会有安全提示!
      

  11.   

    梅雪香MM不存在
    只有梅雪香GG,在南山
      

  12.   

    被 CSDN 的语法分析模块改过了很多地方,所以好些脚本等都运行不起来了。
      

  13.   

    http://www.blogjava.net/mxx/archive/2007/09/30/149899.html
    在这里提供了下载地址.