);
// 递归克隆
function cloneChildrenInOrder(parent, children, filter) {
var done = solve();
children.forEach(function (child) {
done = done
.then(function () {
return cloneNode(child, filter);
})
.then(function (childClone) {
if (childClone) parent.appendChild(childClone);
});
});
return done;
}
}
function processClone(original, clone) {
if (!(clone instanceof Element)) return clone;
solve()
.then(cloneStyle)
.then(clonePseudoElements)
.then(copyUserInput)
.
then(fixSvg)
.then(function () {
svg canvasreturn clone;
});
// 克隆节点上⾯所有使⽤的样式。
function cloneStyle() {
// 顺便提提,为什么不⽤style,因为如果什么样式也没有设置的话,style是光秃秃的        // ⽽getComputedStyle则能获取到应⽤在节点上⾯所有样式
ComputedStyle(original), clone.style);
function copyStyle(source, target) {
if (source.cssText) target.cssText = source.cssText;
else copyProperties(source, target);
function copyProperties(source, target) {
util.asArray(source).forEach(function (name) {
target.setProperty(
name,
);
});
}
}
}
/
/ 提取伪类样式,放到css
function clonePseudoElements() {
[":before", ":after"].forEach(function (element) {
clonePseudoElement(element);
});
function clonePseudoElement(element) {
var style = ComputedStyle(original, element);
var content = PropertyValue("content");
if (content === "" || content === "none") return;
var className = util.uid();
clone.className = clone.className + " " + className;
var styleElement = ateElement("style");
styleElement.appendChild(
formatPseudoElementStyle(className, element, style)
);
clone.appendChild(styleElement);
function formatPseudoElementStyle(className, element, style) {
var selector = "." + className + ":" + element;
var cssText = style.cssText
formatCssText(style)
: formatCssProperties(style);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。