Вам нужно будет не только клонировать, но и, вероятно, захотеть клонировать deep .
node.cloneNode(true);
Документация здесь .
Если для deep установлено значение false, ни один из
дочерние узлы клонируются. Любой текст, который
узел содержит не клонируется
либо, так как он содержится в одном или
больше дочерних текстовых узлов.
Если deep оценивается как true, все
поддерево (включая текст, который может быть в
дочерние текстовые узлы) тоже копируется. За
пустые узлы (например, IMG и INPUT
элементы) не имеет значения,
Глубина установлена в true или false, но вы
все еще должны предоставить значение.
Редактировать: OP утверждает, что node.cloneNode(true)
не копировал стили. Вот простой тест, который показывает обратное (и желаемый эффект) с использованием как jQuery, так и стандартного API DOM:
var node = $("#d1");
// Add some arbitrary styles
node.css("height", "100px");
node.css("border", "1px solid red");
// jQuery clone
$("body").append(node.clone(true));
// Standard DOM clone (use node[0] to get to actual DOM node)
$("body").append(node[0].cloneNode(true));
Результаты видны здесь: http://jsbin.com/egice3/
Редактировать 2
Жаль, что вы не упомянули об этом раньше;) Вычисленный стиль полностью отличается. Измените свой CSS-селектор или примените этот стиль как класс, и у вас будет решение.
Редактировать 3
Поскольку эта проблема является законной, для которой я не нашел хороших решений, меня это достаточно обеспокоило, чтобы придумать следующее. Это не особенно грациозно, но оно выполняет свою работу (протестировано только в FF 3.5).
var realStyle = function(_elem, _style) {
var computedStyle;
if ( typeof _elem.currentStyle != 'undefined' ) {
computedStyle = _elem.currentStyle;
} else {
computedStyle = document.defaultView.getComputedStyle(_elem, null);
}
return _style ? computedStyle[_style] : computedStyle;
};
var copyComputedStyle = function(src, dest) {
var s = realStyle(src);
for ( var i in s ) {
// Do not use `hasOwnProperty`, nothing will get copied
if ( typeof i == "string" && i != "cssText" && !/\d/.test(i) ) {
// The try is for setter only properties
try {
dest.style[i] = s[i];
// `fontSize` comes before `font` If `font` is empty, `fontSize` gets
// overwritten. So make sure to reset this property. (hackyhackhack)
// Other properties may need similar treatment
if ( i == "font" ) {
dest.style.fontSize = s.fontSize;
}
} catch (e) {}
}
}
};
var element = document.getElementById('origin');
var copy = element.cloneNode(true);
var destination = document.getElementById('destination');
destination.appendChild(copy);
copyComputedStyle(element, copy);
См. Статью PPK под названием Get Styles для получения дополнительной информации и некоторых предостережений.