(λ―Έμ, λλ μμ΄λ₯Ό μ λͺ»ν΄)
μλ
νμλκΉ,
μ΄ λ©μ§ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ SVG νκ·Έλ₯Ό λ λλ§νκ³ μμ΅λλ€.
SVGμ ν
μ€νΈ νκ·Έλ₯Ό μΊλ²μ€λ‘ λ λλ§ν λ μΌλΆ ν
μ€νΈκ° κ²ΉμΉ©λλ€.
ν
μ€νΈ νκ·Έλ ν
μ€νΈ λ
Έλ λ° SVGλ‘ μ²λ¦¬λ©λλ€.
transform μμ±μ μ¬μ©νλ©΄ μ½κ² νμΈν μ μμ΅λλ€.
λ€μμ μν μ½λμ
λλ€(html2canvas 0.5.0-alpha2 ν¬ν¨)
<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
<svg width="100" height="100">
<g transform="translate(20,20)">
<text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
</g>
</svg>
<script>
$(document).ready(function() {
html2canvas(document.body, {
onrendered: function(canvas) {
document.body.appendChild(canvas);
}
});
})
</script>
</body>
</html
κ·Έλ¦¬κ³ μ¬κΈ° λ΄ λΉ λ₯Έ λ³κ²½ μ¬νμ΄ μμ΅λλ€.
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
μ΄κ²μ΄ λμμ΄ λκΈ°λ₯Ό λ°λλλ€.
#ν¨μ§λ κ°μ¬ν©λλ€. κ·Έκ² λμκ² λμμ΄ λλ€.
κ°μ¬ν©λλ€, λ§μ΄ λμμ£ΌμΈμ!
μμ ν΄μ£Όμ μ κ°μ¬ν©λλ€!
tspan tagNameμ νμΈν μλ μμ΅λλ€.
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "ν
μ€νΈ" && node.parentElement.tagName !== "tspan"
@ncoquelet λ΄ μ½λλ₯Ό μ λ°μ΄νΈνμ΅λλ€. κ°μ¬ ν΄μ!
@ν¨μ§
IEμμ ν
μ€νΈν ν parentElement
μμ±μ΄ νμ¬ λ
Έλμ μ±μμ§μ§ μμκΈ° λλ¬Έμ μμ μ¬νμ΄ μλνμ§ μμ΅λλ€. λμ parentNode
μ¬μ©νμμμ€! μ΄μ¨λ μ°λ¦¬λ NodeParser
μκ³ λ
Έλμ λν΄ μ΄μΌκΈ°νκΈ° λλ¬Έμ λ λͺ
νν κ²μ
λλ€.
κ·Έλ μ§ μμΌλ©΄ νκ·Έ μ΄λ¦μ ν
μ€νΈνλ λμ parentNode
μ μΈμ€ν΄μ€λ₯Ό ν
μ€νΈνλλ‘ μ½λλ₯Ό λ³κ²½νκ³ parentNodeκ° SVGElement
κ° μλ κ²½μ°μλ§ νμ¬ λ
Έλμ TextContainer
μμμ μ²λ¦¬ν©λλ€. .
κ·Έκ²μ ν¬λ‘¬κ³Ό ie11μμ μλν©λλ€. νμ΄μ΄νμ€μμλ λΉ μΊλ²μ€ λ²κ·Έ λλ¬Έμ ν μ€νΈν μ μμ΅λλ€!
λ΄ μ½λ
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
μ΄κ² λμμ΄ λκΈΈ λ°λλ€.
λ΄ νμ΄μ΄ νμ€ λ¬Έμ λ₯Ό ν΄κ²°νκ³ ffμμλ μλν©λλ€ :-)
λ λΆλͺ
ν!
ffμμλ μ μλνλμ§ νμΈνμ΅λλ€.
μμ μ¬νμ λ³ν©νκ³ pull μμ²μ΄ μ
λ°μ΄νΈλμμ΅λλ€. κ°μ¬ ν΄μ :)
@hyojin @ncoquelet μ΄μ λν μ‘°μ¬μ μμ μ κ°μ¬λ립λλ€. λλ μμ μ λκ°μ λ¬Έμ μ λΆλͺμ³€κ³ κ·Έ μμΈμ΄ 무μμΈμ§ μμ ν νμ νμ§ λͺ»νμ΅λλ€.
μ¬κΈ°μ νΌλμ€λ¬μμ§λμ§ μ λͺ¨λ₯΄κ² μ§λ§ "Uncaught ReferenceError: NodeParser is not defined"λΌλ μμΈκ° λ°μν©λλ€.
@Suchetana10 μΈμ μμΈκ° λ°μνμ΅λκΉ? λ‘λ© μ€ν¬λ¦½νΈμμ?
@hyojin κ°μ¬ν©λλ€.. μΌνμ΅λλ€.
@hyojin κ°μ¬ν©λλ€! λμκ²λ μλ²½νκ² μλν©λλ€.
happyvishwasvadavi ugnugen κ·Έ μμμ λ€μΌλ κΈ°μ©λλ€! :)
μ΄λ€ μ¬λλ€μ μ¬μ ν ββν μ€νΈ μμμ λ¬Έμ κ° μμ΅λλ€. μ΄ λ¬Έμ λ₯Ό μ΄μ΄μ PRμ λ€μ 보λ΄κ² μ΅λλ€.
λ΄κ° ν μ€νΈν μ μλ μ΄ μμ μ¬νμ΄ ν¬ν¨λ λΌμ΄λΈλ¬λ¦¬ λΉλκ° μλ μ¬λμ΄ μμ΅λκΉ? νμ΄ μ°¨νΈ νμ΄μ§μμ λμΌν λ¬Έμ κ° νμλ©λλ€.
μ΄ λΉλλ₯Ό μμ μ¬νκ³Ό ν¨κ» μ¬μ©ν μ μμ΅λκΉ? λλ μ¬μ ν νμ΄ μ°¨νΈμμμ΄ λ¬Έμ μ μ§λ©΄νκ³ μμ΅λλ€.
μ΄ μμ μ¬νμ λΉλμμ μ¬μ©ν μ μμ΅λκΉ? μλλ©΄ μ¬μ μλ₯Ό λ§λ€μ΄μΌ ν©λκΉ?
μ΄κ²μ΄ μ¬μ ν v1.0.0 μ λ¬Έμ μ λκΉ? κ·Έλ λ€λ©΄ jsfiddleμ λν μλ₯Ό
μ΄ νΈλ μμ μμ μΆκ° μ 보 μμ²μ λν μλ΅μ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ’ λ£λμμ΅λλ€. νμ¬ λ¬Έμ μ μλ μ 보λ§μΌλ‘λ μ‘°μΉλ₯Ό μ·¨νκΈ°μ μΆ©λΆν μ λ³΄κ° μμ΅λλ€. λ μ‘°μ¬ν μ μλλ‘ νμν λ΅λ³μ΄ μκ±°λ μ°ΎμΌλ©΄ μ°λ½ν΄ μ£Όμμμ€.
μΉμ νλ @niklasvh ,
μ΄ λλΌμ΄ λΌμ΄λΈλ¬λ¦¬μ κ°μ¬λ립λλ€. μ΅μ λ²μ μΈ v1.0.0-rc.3μμ μ΄ λ¬Έμ λ₯Ό μ¬νν μ μμ΅λλ€.
μ¬κΈ° μμ λ§λ€μμ΅λλ€ (Chromeλ§ ν΄λΉ). μ¬κΈ°μ μΌλΆ ν μ€νΈ λ Έλ(κ·Έλν μ λͺ©μ μμ)κ° λ³΅μ λ κ²μ λ³Ό μ μμ΅λλ€.
μ¬ν λ¨κ³ -
κ·Έλν μ λͺ©μ Line#193μ μΆκ°λ©λλ€.
@hyojin , μ΄μ λ€μ μ΄μ΄
λ¬Έμ μΈμ¬,
μΉ΄λ
μλ
νμΈμ @karannagupta
κ°μ μ΄μ μμ μ€λμ§ νμΈνκΈ° μν΄ λ΄ μ§μ μ μλ ν μ μμ΅λκΉ?
μλ νμΈμ @hyojin
λΌμ΄λΈλ¬λ¦¬ λ²μ (v0.5.0-alpha2)μμλ μλνμ§ μμ΅λλ€. μ¬κΈ° λ΄ νμμ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν μ€νΈν μ μμ΅λλ€.
λν μ΅μ λ²μ μ html2canvasλ₯Ό μ¬μ©νκ³ μΆμ΅λλ€. λλ λν html2canvas.svgλ₯Ό μ¬μ©ν νμκ° μμ΅λλ€.
λ¬Έμ μΈμ¬,
μΉ΄λ
μ λμ½λ κΈκΌ΄μ λ¬Έμ κ° μλ κ²μΌλ‘ λνλ¬μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
@ν¨μ§
IEμμ ν μ€νΈν ν
parentElement
μμ±μ΄ νμ¬ λ Έλμ μ±μμ§μ§ μμκΈ° λλ¬Έμ μμ μ¬νμ΄ μλνμ§ μμ΅λλ€. λμparentNode
μ¬μ©νμμμ€! μ΄μ¨λ μ°λ¦¬λNodeParser
μκ³ λ Έλμ λν΄ μ΄μΌκΈ°νκΈ° λλ¬Έμ λ λͺ νν κ²μ λλ€.κ·Έλ μ§ μμΌλ©΄ νκ·Έ μ΄λ¦μ ν μ€νΈνλ λμ
parentNode
μ μΈμ€ν΄μ€λ₯Ό ν μ€νΈνλλ‘ μ½λλ₯Ό λ³κ²½νκ³ parentNodeκ°SVGElement
κ° μλ κ²½μ°μλ§ νμ¬ λ ΈλμTextContainer
μμμ μ²λ¦¬ν©λλ€. .κ·Έκ²μ ν¬λ‘¬κ³Ό ie11μμ μλν©λλ€. νμ΄μ΄νμ€μμλ λΉ μΊλ²μ€ λ²κ·Έ λλ¬Έμ ν μ€νΈν μ μμ΅λλ€!
λ΄ μ½λ
μ΄κ² λμμ΄ λκΈΈ λ°λλ€.