JavaScript和复制风格

Ste*_*ger 8 javascript css

我正在使用javascript复制表格单元格.

它工作正常,只是它不复制样式.我想复制如下,但这不起作用.newCell.style = oldCell.style;

所以我认为对于我的text-align,我必须像这样复制它:newCell.style.textAlign = oldCell.style.textAlign;

这很有用,但每当我添加一个新的样式项时,我都要记得在这里注册它.

那么,我现在的问题是如何循环样式并复制那里的每一个项目?

使用chrome,我设法做到这样:

 var strAttribute = GetDomNameFromAttributeName(oRow.cells[1].style[0]);
    var styletocopy = eval('oRow.cells[1].style.'+strAttribute);
    eval("newCell.style."+strAttribute+"='"+styletocopy+"'"); // //newCell.style.textAlign='center';
Run Code Online (Sandbox Code Playgroud)

但这不适用于IE.没有用FF测试它,但假设铬兼容性.

有没有办法循环IE中的样式元素?或者有没有更好的方法来复制所有样式元素?

bob*_*nce 11

eval('oRow.cells[1].style.'+strAttribute)
Run Code Online (Sandbox Code Playgroud)

永远不要这样使用eval(*).在JavaScript中,您可以使用方括号访问其名称存储在字符串中的属性.object.plop与以下相同object['plop']:

to.style[name]= from.style[name];
Run Code Online (Sandbox Code Playgroud)

(*:eval如果你能提供帮助,就永远不要使用.只有极少数非常特殊和罕见的场合你需要它.)

有没有办法循环样式元素

style对象应该支持DOM Level 2 CSSCSSStyleDeclaration接口.你可以遍历规则并将它们应用到另一个元素,如下所示:

for (var i= from.style.length; i-->0;) {
    var name= from.style[i];
    to.style.setProperty(name,
        from.style.getPropertyValue(name),
        priority= from.style.getPropertyPriority(name)
    );
}
Run Code Online (Sandbox Code Playgroud)

在IE?

不,IE不支持整个CSSStyleDeclaration接口,上面的内容不起作用.然而,有一种更简单的方法,不涉及循环,它将适用于IE和其他浏览器:

to.style.cssText= from.style.cssText;
Run Code Online (Sandbox Code Playgroud)

就如此容易!IE并没有像它应该的那样保留CSS文本,但是区别对于简单的内联样式复制并不重要.

然而,正如Pikrass所说(+1),如果你要复制整个元素而不仅仅是样式,那么这cloneNode是迄今为止最优雅的方式.


Pik*_*ass 9

您可以使用.cloneNode(true)复制包含其所有内容(包括属性)的DOM元素:

var clonedTr = document.getElementById('id').cloneNode(true);
Run Code Online (Sandbox Code Playgroud)

然后clonedTr是tr #id的精确副本."true"表示您要复制元素的内容.

  • 那是因为insertRow创建了一个新行.它不会将您的行放在表中.您可以在表的tbody上使用insertBefore,如下所示:`tab.getElementsByTagName('tbody')[0] .insertBefore(tr,tab.rows [2]);` (3认同)