如何将一个对象的所有用户提供的样式复制到另一个对象?

4

有人在这里提问如何将一个对象的css样式复制到另一个对象中。通常被接受的答案是:

var p = document.getElementById("your_p_id");
var div = document.createElement("div");
div.innerHTML = "your div content";
div.style.cssText = document.defaultView.getComputedStyle(p, "").cssText;

然而,我的情况有点不同。我有一个脚本,创建一个 span 来代替一个 select 标签,然后隐藏该 select。这样做可以更容易地进行 CSS 样式设置,因为我可以更容易地设置 span,相对于一个固定的 select 标签。
当我使用 cssText,将应用于 select 上的任何样式复制到 span 上时,它最终看起来像一个 select 标签。由于所有内置样式也被应用于 span 而不仅仅是用户输入,那么我必须覆盖这些数十个 CSS 属性,这违背了一开始使用 span 标签的初衷。
是否有一种方法只复制用户提供的样式而不是用于设置元素样式的整个样式表呢?
到目前为止,我已经能够通过从 select 到 span 传输 class 和 id 来传输应用的样式,但我的挑战在于获取直接应用于 select 标签上的样式(即在样式/样式表中,它读取:select {blah : bloh;})。

用户定义的样式如何应用?使用类吗?如果是,则应用相同的类。 - Anupam
你需要支持旧版浏览器吗? - Jacques Marais
你是否只需要 style 属性中的样式? - Jarek
尽可能广泛的浏览器支持是必要的。 - user7267879
1个回答

0
尝试像这样做:

function ApplyStyles(select, span) {
    var select = document.querySelector(select);
    var span = document.querySelector(span);
    var sheets = document.styleSheets;

    for(var i = 0; i < sheets.length; i++) {
        var rules = sheets[i].cssRules || sheets[i].rules;   
        for(var r = 0; r < rules.length; r++) {
            var rule = rules[r];
            var selectorText = rule.selectorText;
            if(document.querySelector(selectorText) == select){
        for(var l = 0; l < rule.style.length; l++){
            span.style[rule.style[l]] = rule.style[rule.style[l]];
        }
            }
        }
    }
}

然后像这样使用函数:

ApplyStyles("#selection", "#span");

这是一个JSFiddle的例子:https://jsfiddle.net/rsLnaw56/2/ 它的工作原理是找到应用于

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接