hta工具:从.css文件中清理不使用的样式类(id或class类)

-----------代码----------

<!DOCTYPE html>
<html>
<head>
<title>清除不使用的样式</title>
</head>
<body>
<iframe id="html"  application="yes" style="display:none;"></iframe>
选择html文件<input type="file" id="htmlPath" />选择css文件<input type="file" id="cssPath" /><button οnclick="startCls();">开始整理</button><br/>
整理后css内容<textarea id="outCss" /></textarea>

<script>
function getObj(id) {
    return 'string' == typeof id ? document.getElementById(id) : id;
}

function startCls() {
    var hPath = getObj('htmlPath').value;
    var cPath = getObj('cssPath').value;
    
    if (!hPath || !cPath) {
        alert('请选择css/html文件');return;
    }
    
    if (!/\.html?$/i.test(hPath) || !/\.css$/i.test(cPath)) {
        alert('html文件后缀必须是.html(htm)/css文件后缀必须是.css');return;
    }
        
    getObj('html').src = hPath;
    cPath = setInterval(function() {
        if ('complete' == frames[0].document.readyState) {
            document.title = '载入完成';
            clearInterval(cPath);
            getChild(frames[0].document);
        }
    }, 500);
}

function getChild(doc){//获取所有body内的标签的id或class
    
    var allTag = doc.body.getElementsByTagName('*');
    window.allClass = {};
    var clas;
    
    for (var i = 0; i < allTag.length; i++) {
        window.allClass[allTag[i].className] = true;//记录标签名
        
        if (clas = (' ' + allTag[i].className + ' ').match(/ (\w+)(?= )/g) ) {//得到所有class
            for (var ii = 0; ii < clas.length; ii++) {
                window.allClass['.' + clas[ii].toString().replace(' ', '')] = true;
            }
        } else if (/^[a-z]\w*$/i.test(allTag[i].id)) {//只获取以字母开始的id
            window.allClass['#' + allTag[i].id] = true;
        }
    }
    
    compace();
}

function compace() {//检测class是否用上
    var utf = frames[0].document.charset.toLowerCase().indexOf('utf-8utf8') > -1 ? 1 : 0;//根据html的编码打开css文件模式
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var r = 1;
    var c = 0;
    var r = fso.OpenTextFile(getObj('cssPath').value, r, c, utf);
    var css = r.readAll().replace(/\/\*[\s\S]*?\*\//g, '');//移除注释;
    r.close();
    
    if (! (css = css.match(/[^\{\}]+\{[^\{\}]*\}/g))) {
        return alert('没有存在class格式内容');
    }

    window.css = [];
    css[0] = css[0].replace(/(@charset [^;]+;)\s?/i, function($0, $1){//确定编码
            window.css.push($1);//编码
            return '';
        }
    );
    
    for (var vals, tmp, names, name, n, r, i = 0; i < css.length; i++) {
        vals = css[i].split('{');
        names = vals[0].split(',');//根据,号分开成多个name
        tmp = [];
        vals = clSpace('{' + vals[1]);//class规则
        
        for (var ii = 0; ii < names.length; ii++) {
            name = names[ii].replace(/^\s+|\s+$/g, '');//移除空格
            
            if ('*' == name) {//直接放回//针对所有标签
                tmp.push(name);
            } else if (/^[a-z]/i.test(name)) {//指定标签式,暂不做对比,可能后面在增加标签上用上此class                 
                /*
                if (window.allClass[name]) {//存在id//id式
                    tmp.push(name);
                } else {//不存在
                    continue;
                }
                */
                tmp.push(name);
            } else if (/^\./i.test(name)) {//类名式  
                n = name.split(' ')[0];
                
                if (window.allClass[n]) {//类被使用
                    tmp.push(name);
                } else {//未使用
                    continue;
                }
            } else if (/^#/i.test(name)) {
                n = name.split(' ')[0];
                
                if (window.allClass[n]) {//存在id//id式
                    tmp.push(name);
                } else {//不存在
                    continue;
                }
            } else{//必须是非已知格式//无法预料格式,
                tmp.push(name);
            }
        }
        
        tmp.length && window.css.push(tmp.join(',') + vals);//有用
    }    
    
    function clSpace (str) {//移除样式内的空格
        str = str.replace(/\s+(?=[\{,;\:\}])/g, '');
        str = str.replace(/([\{,;\:\}])\s+/g, '$1');
        return str;
    }
    
    getObj('outCss').value = window.css.join('\n');
}

</script>
</body>
</html>

-----------------说明--------

只支持一个页面内是否使用的清理,如果多个文件可能使用到,需要把所有可能使用到文件进行手工合并,反正原理是,载入html,取到body下面的所有的子对象的tagname(目前未对此类指定模式进行清理)/id/class样式名,然后把所有的样式名进行检测,如果所有的body子对象都没使用到,就认为未被使用.将清理.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值