微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用jQuery / Javascript合并css类

我有个问题.我有一堆网页,大量使用多个css类.

<div class="class1 class2 class3">foo</div>

不幸的是,我有一个“浏览器”(缺少一个更好的术语)无法以这种方式处理多个css类.

我可以使用multiple classes识别所有元素,但现在我需要创建合并它们的新类.第一次尝试是将所有样式内联到样式属性中,但这太慢了,并且文档不必要地膨胀.

我现在想要做的是找到一个包含多个类的元素.创建一个组合的新类,并将元素类替换为新创建的类,以及具有相同类组合的任何其他元素.

关于如何最好地接近这个的任何想法.

解决方法

简介:此函数返回所有重复类名的有序列表,可以轻松地用于合并类.

首先,获取有用的重复列表:

var multi = {};

$("*[class]").each(function(){
    var class = this.className.replace(/^\s+|\s+$/g,"").replace(/\s+/g,".");
    if(!/\./.test(class)) return; //Ignore single classes
    if(multi[class]){
        multi[class]++;
    } else {
        multi[class] = 1;
    }
});

//Now,merge duplicates,because .class1.class2 == .class2.class1
var multi_nodup = {};
for(var classes in multi){
    var a_classes = classes.split(".");
    var a_classes = a_classes.sort();
    var a_classes = a_classes.join(".");
    if(multi_nodup[a_classes]){
        multi_nodup[a_classes] += multi[classes];
    } else {
        multi_nodup[a_classes] = multi[classes]
    }
}
//Now,multi_npdup is a map of all duplicate classnames

var array_multi = [];
for(var classes in multi_nodup){
    array_multi.push([multi_nodup[classes],classes]);
}
array_multi.sort(function(x,y){return y[0]-x[0]});
//array_multi is an array which looks like [["class1.class2.class2",33],//             ["class3.class4",30],...]
// = A list,consisting of multiple class names,where multiple classnames
// are shown,together with the nuber of occurences,sorted according to
// the frequence

执行我的函数,并输出变量array_multi.这将显示多个类名称的映射,以便您可以相应地替换多个类名.

由于我存储类名的特殊方式,您可以使用$(“.”array_multi [n] [0])来访问所有具有一组classname的元素,该类名等于array_multi中第n个位置所描述的set .

可读输出示例:

//Overwrites current document!
var list = "";
for(var i=0; i<array_multi.length; i++) list += array_multi[i][0] + "\t" + array_multi[i][1];
document.open();
document.write("<pre>"+list+"</pre>")
document.close();

自动转换

一种通过将所有单独的类属性添加到JavaScript字符串来自动合并类名i的方法,并将其添加到对象中.这是获取确切CSS属性的最可靠方法,因为尝试通过document.styleSheets对象获取类名可能会产生稍微不同的结果.例:

var classstyle = {};
classstyle["class1"] = "border:1px solid #000;";
classstyle["class2"] = "color:red";

//Make sure that each declaration ends with a semicolon:
for(var i in classstyle) if(!/;$/.test(classstyle[i])) classstyle[i] += ";";

//Initialise
var all_styles = {};
for(var i=0; i<array_multi.length; i++){
    all_styles[array_multi[i][1]] = "";
}

//This loop takes deFinition precedence into account
for(var currentCName in classstyle){
    var currentClass = new RegExp("(?:^|\\.)" + currentCName + "(?:\\.|$)");

    // Rare occasion of failure: url("data:image/png,base64;....")
    var separateProps = classstyle[currentCName].split(";");
    var prop_RE = {};
    for(var p=0; p<separateProps.length; p++){
        var cssproperty = separateProps[p];
        if(!/:/.test(cssproperty)) continue; //Invalid CSS property
        prop_RE[cssproperty] = new RegExp("(^|;)\\s*" + cssproperty.match(/(\S+)\s*:/gi)[1] + "\\s*:[^;]+;?","gi");
    }

    for(var class in all_styles){
        if(currentClass.test(class)){
            for(var k in prop_RE){
                all_styles[class] = all_styles[class].replace(prop_RE[k],"$1") + k;
            }
        }
    }
}

//To finish off:
var allClassesToString = "";
for(var class in all_styles){
    var newClass = class.replace(/\./g,"_");
    $("."+class).each(function(){
        this.className = newClass;
    });
    allClassesToString += "."+newClass + "{" + all_styles[class] + "}\n";
}

// allClassesToString <------- This variable Now holds a string of all duplicate CSS classes!
//Example:
var style = $("<style>");
style.text(allClassesToString);
style.appendTo($("head:first"));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐