์ค๋ฅ ๋ฐ์: "html2canvas $npm_package_version. ์ค๋ฅ: ์กํ์ง ์์(์ฝ์ ์ค): ์ค๋ฅ: ๊ตฌ์ฑ์์ ์ฐพ์ ์ ์์ต๋๋ค."
์บ๋ฒ์ค๋ฅผ ์ป์ผ๋ ค๊ณ ํ ๋.
์ํธ:
html2canvas(document.querySelector("#capture")).then(ํจ์(์บ๋ฒ์ค) {
console.log(์บ๋ฒ์ค);
document.getElementById('here-appear-theimages').appendChild(์บ๋ฒ์ค);
});
์ฌ์ฉ:
์ต๊ทค๋ฌ ๋ฒ์ : 4.0.1
์ด์ ์ฒด์ : ์๋์ฐ 10
๋ํ https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.auto.js์ ์ฐธ์กฐ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
์ฒจ๋ถ๋ ์ค๋ฅ ์คํฌ๋ฆฐ์ท.
๋๋ ๋ค์ ์ฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ฐ๋ฆฌ๋ฅผ ์ํด IE 11์ ์์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js
์ค๋ฅ๋ฅผ ์ฌํํ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ ๋ง ๋์์ด ๋ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ @niklasvh ๋ ,
์ด๊ฒ์ ๋ด๊ฐ ๋ณผ ์ ์๋ GitHub์์ ํธ์คํ ํ ๋ฐ๋ชจ ์ํ์ ๋๋ค. - GitHub Html2Canvas Demo
๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ ์ ์ฒด ์ฝ๋๋ github์ ์ ๋ก๋๋ฉ๋๋ค. ์ฝ๋ ํจํค์ง
ํ๋ก์ ํธ ์คํ ๋ฐฉ๋ฒ:
1) ํจํค์ง ์์ถ ํ๊ธฐ
2) ์ข
์์ฑ์ ์ค์นํ๊ธฐ ์ํด ๋๋ ํ ๋ฆฌ์์ "npm install" ๋ช
๋ น์ ์คํํฉ๋๋ค.
3) ํ๋ก์ ํธ ๋ช
๋ น์ ์คํํ๋ ค๋ฉด: "npm start"
์๋ ํ์ธ์ @jelkins8 ๋ ,
์ด ์๋ฃจ์
์ ์๋ํ์ง๋ง ์๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๋ณผ ์ ์๋ GitHub์์ ํธ์คํ
ํ ๋ฐ๋ชจ ์ํ์
๋๋ค. - GitHub Html2Canvas Demo
๊ฐ์ฌ ํด์
์๋
ํ์ธ์ @niklasvh ๋ ,
๋๋ IE11์์ ์ฑ๊ณตํ์ง ๋ชปํ es6-promise ๋ฐ bluebird๋ก ์๋ํ์ง๋ง GitHub Html2Canvas Demo ๋ IE์์ ์คํจํ์์ ํ์ธํ ์ ์์ต๋๋ค.
html2canvas: Error: Member not found.
๋ค์์ Possible Unhandled Promise Rejection: Error: Member not found.
๋ฐ์ต๋๋ค.
๊ฐ์ฌ ํด์!
์ ๋ฐ์ดํธ๋ ๋ธ๋ฃจ๋ฒ๋ ํด๋ฆฌํ ์ฌ์ฉ ํ ์คํ ์ถ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Error: Member not found.
at Anonymous function (eval code:213:21)
at createElementClone (eval code:212:17)
at cloneNode (eval code:225:13)
at cloneNode (eval code:248:25)
at cloneNode (eval code:248:25)
at DocumentCloner (eval code:53:9)
at cloneWindow (eval code:505:5)
at Anonymous function (eval code:53:9)
at r (https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js:31:6804)
at r.prototype._settlePromiseFromHandler (https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js:30:12222)
html2canvas์ ๋ํด ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. IE์ ๋ํด ๊ตฌ์ฑ์์ ์ฐพ์ ์ ์์ต๋๋ค.
ํฌ๋กฌ์ ๊ฒฝ์ฐ ์๋ฒฝํ๊ฒ ์ ์๋ํฉ๋๋ค.
ํด๊ฒฐ์ฑ
์ด ์์ผ๋ฉด ์
๋ฐ์ดํธํ์ญ์์ค. ๊ฐ์ฌ ํด์
๋ฌธ์ ๋ฅผ ์ฌํํ๊ณ ์์ธ์ ์ฐพ์์ต๋๋ค. cssText
์์ฑ์ ์ก์ธ์คํ๋ ค๊ณ ํ ๋ createElementClone
ํจ์์์ ๋ฐ์ํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก fa-spin
์๋ ์์์ธ font-awesome์ ์ฌ์ฉํ ๋
๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
if (node instanceof HTMLStyleElement && node.sheet && node.sheet.cssRules) {
var style = node.cloneNode(false);
var css = [].slice.call(node.sheet.cssRules, 0).reduce(function (css, rule) {
try {
if (rule && rule.cssText) {
return css + rule.cssText;
}
return css;
} catch (err) {
_this3.logger.log('Unable to access cssText property', rule.name);
}
}, '');
style.textContent = css;
return style;
}
try...catch์ ์ ์ํ์ญ์์ค.
PR์ ์ฌ๋ฆฌ๊ฒ ์ต๋๋ค.
Firefox 58.0.0 (Linux 0.0.0) /tests/reftests/background/radial-gradient2.html Should render untainted canvas FAILED
@niklasvh ์์ ํ๊ท๋ฅผ ์ผ์ผํค๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ํ ๋ฒ ์ดํด๋ณด์ค ์ ์์ต๋๊น?
๊ฐ์ฌ ํด์
์๋
ํ์ธ์ @niklasvh ๋ ,
์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ด ์์ต๋๊น? ์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์๋ ์ฌ๋์ด ์์ต๋๊น?
๊ฐ์ฌ ํด์
์๋ ํ์ธ์ @Prabhat2404 , ๋ด๊ฐ https://github.com/niklasvh/html2canvas/pull/1415 ์์ ์ ์ํ ์์ ์ฌํญ์ ์ ์๊ฒ ํจ๊ณผ์ ์ด์ง๋ง @niklasvh ์๊ฒ ์์ฒญํ ๋ฐฉ์ฌํ ๊ทธ๋๋์ธํธ ํ ์คํธ ์ค ํ๋์ ์คํจํ์ต๋๋ค. ๋ด๋ด. ๊ธ๊ผด์ด ๋ฉ์ง ์์ด์ฝ, ํนํ fa-spin์ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ ๊ฐ์ ๋ฌธ์
html ์ฝ๋๋ฅผ ์ธ์ํ๋ ค๊ณ ํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ IE์ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
+1
+1
+1
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋์
@evgenyjam ๊ทธ ์๋ฃจ์ ์๋ ์ฌ์ ํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. reduce์ ์ด๊ธฐ ๊ฐ์ผ๋ก ๋น ๋ฌธ์์ด์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
PR์์ ์ธ๊ธํ์ง๋ง ์์ฑ์๋ ์์ง ์ ๋ฐ์ดํธํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ณํ์ ํจ๊ป ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
@cyouden ์ด์ชฝ์ผ๋ก?
.reduce(("", CSS, ๊ท์น) => {
@BrunoMarc ์๋์,
.reduce((css, ๊ท์น) => { /* ์ฝ๋ */ }, "")
(์๋ฅผ ๋ค์ด, ํด๋น diff์์ ๊ต์ฒดํ๊ธฐ ์ํด ์ ์๋ ๋ณ๊ฒฝ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ฉด reduce์ ๋ํ ์ด๊ธฐ ๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํฉ๋๋ค.)
@cyouden ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค! ์ด ์ฝ๋๋ฅผ html2canvas.js์ ์ฝ์
ํ์ง๋ง ์ฐพ์ ์ ์๋ ๋ฉค๋ฒ๊ฐ ์ฌ์ ํ ์ง์๋ฉ๋๋ค. ์์ด๋์ด๊ฐ ์์ต๋๊น?
if (HTMLStyleElement ๋
ธ๋ ์ธ์คํด์ค && node.sheet && node.sheet.cssRules) {
const CSS = [].์ฌ๋ผ์ด์ค
.call(node.sheet.cssRules, 0)
.reduce((css, ๊ท์น) => {
๋
ธ๋ ฅํ๋ค {
if (๊ท์น && ๊ท์น.cssText) {
๋ฐํ CSS + ๊ท์น.cssText;
}
๋ฐํ CSS;
} ์ก๊ธฐ(์ค๋ฅ) {
this.logger.log('cssText ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค', rule.name);
๋ฐํ CSS;
}
}, '');
const ์คํ์ผ = node.cloneNode(๊ฑฐ์ง);
style.textContent = CSS;
๋ฐํ ์คํ์ผ;
}
@BrunoMarc ์๋ฌด ์๊ฐ์ด ์์ต๋๋ค. ๊ทธ ๋ณ๊ฒฝ์ผ๋ก ์ถฉ๋ถํ์ต๋๋ค.
์๋
ํ์ธ์ - ํํฐ์ ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค. ์ ์๋ ๋๋ก ๊ธฐ๋ณธ ๋น ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ์ ์ปค๋ฐํ์ต๋๋ค. ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค!
๊ฑด๋ฐฐ
@niklasvh @BrunoMarc @cyouden ์ข์ ์์์ ๋น๋๊ฐ PR์ ์ํด ์ ๋ฌ๋๊ณ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ ์ผ์ฐ ์
๋ฐ์ดํธํ์ง ์์์ต๋๋ค. ์ค์ ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฎ๊ธฐ์ง ์๊ณ ๊ณ์ ์ด๋ํ์ต๋๋ค. ์คํ์ดํฌ์์ ์ฌ์ฉํ๋ ๋์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
@simonpinn ๋ด ๊ฐ๋ 4 ์ฝ๋์ html2canvas-1.0.0-alpha.10 ๋ฒ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ html์ ์ผ๋ถ๋ง ์ธ์๋ฉ๋๋ค.
34487ms html2canvas: html2canvas $npm_package_version
core.js:1427 ์ค๋ฅ ์ค๋ฅ: ์กํ์ง ์์(์ฝ์ ์ค): ์ ์๋์ง ์์
resolvePromise(zone.js:824)์์
resolvePromise(zone.js:795)์์
ํ๊ฐ ์(zone.js:873)
ZoneDelegate.invokeTask(zone.js:425)์์
Object.onInvokeTask์์(core.js:4747)
ZoneDelegate.invokeTask(zone.js:424)์์
Zone.runTask์์ (zone.js:192)
drainMicroTaskQueue์์(zone.js:602)
ZoneTask.invokeTask์์ [ํธ์ถ๋ก] (zone.js:503)
invokeTask์์(zone.js:1540)
defaultErrorLogger @ core.js:1427
ErrorHandler.handleError @ core.js:1488
Logger.js:36 83270ms html2canvas: ๋
ธ๋ ํธ๋ฆฌ ๊ตฌ๋ฌธ ๋ถ์ ์๋ฃ
๊ธธ์ด์ ์๋ชป๋ ๊ฐ์ด ์ง์ ๋จ: "์๋"
@simonpinn ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. tyscript(angular 4) ์ฝ๋์ ์ต์ ๋ฒ์ 1.0.0-alpha.10์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์๋ฃจ์ ์ ๋์์ฃผ์ธ์. ๋๋ ๋งค์ฐ ํ์ํฉ๋๋ค.
@bandacs ์ด ๋ฌธ์ ๋ ์กํ์ง ์์ ์ฝ์์ ๋ํ IE 11 ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ alpha.10 ๋น๋์ ๋ํด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ธ์.
๊ฐ์ฌ ํด์
@simonpinn @cyouden
์์ ๊ฒฐํจ์ ๋ํ ํ์ ์กฐ์น. Chrome ๋ฐ Firefox ๋ธ๋ผ์ฐ์ ์ฉ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(dom-to-image)๋ฅผ ์ฐพ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ์ฌ์ ํ IE์์ ๊ณ์๋ฉ๋๋ค. ์์ ๋ํ๋ฅผ ํตํด ๋น ๋ฌธ์์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๊ฒฐํจ์ ์์ ํ๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. ๊ทธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ํฉ๋๊น? ๋ํ ๊ทธ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ์ ํฌํจ๋ ์ง ์ ์ ์์ต๋๊น?
v1.0.0-alpha.11์์ ๋ณํฉ๋ ์์
reactjs ํ๋ก์ ํธ๊ฐ ์๊ณ html2canvas ์ ๋ฐ์ดํธ๋ฅผ ์ํด npm์ ์ค์นํ์ต๋๋ค. ํ์ง๋ง IE 11 ๋ธ๋ผ์ฐ์ ์์๋ ์ฌ์ ํ Member not found ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. ๋์์ฃผ์ธ์. Windows 8 ์์คํ ์์ ํ์ธํ์ต๋๋ค.
v1.0.0-alpha.11์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ Chrome์์๋ ์ ์๋ํ์ง๋ง IE 11์์ ๊ฐ์ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
html2canvas(ํจ๋).then(์บ๋ฒ์ค => {
var img = ์บ๋ฒ์ค.toDataURL("์ด๋ฏธ์ง/png");
});
์๋ ํ์ธ์. ๋์๊ฒ๋ ๊ฐ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ ๊ณ ๊ฐ์ IE11์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํฉ๋๋ค ...
๊ณ ์ณค๋ค!!
node_modules/html2canvas/dist/html2canvas.js
์ด๊ธฐ
if (rule && rule.cssText)
if (rule && typeof rule.cssText === 'string')
๋ณ๊ฒฝํฉ๋๋ค.
์ด๊ฒ์ IE11์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. :)
์๋
๋ชจ๋,
๋๋ ๋ํ ํด๊ฒฐ ๋ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
node_modules/html2canvas/dist/html2canvas.js ์ด๊ธฐ
if(rule && rule.cssText) ๊ฒ์
if (rule && typeof rule.cssText === 'string')๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ด๊ฒ์ IE11์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. :)
๋ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ๊ฒ์ ๋ฒ์ ์ ์ป์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ํ์ฌ ๋ก์ปฌ ํ๊ฒฝ์ ๋ ธ๋ ๋ชจ๋์์ ํธ์งํ์ฌ ํ ์คํธํ์ต๋๋ค. ๊ทธ๊ฒ์ ํ๋ก๋์ ์ผ๋ก ํธ์ํ๋ ค๋ฉด 'html2canvas' ๋ฒ์ ์ ์๋ก์ด ๊ฒ์ ๋ฒ์ ์ด ํ์ํฉ๋๊น? ์ป์ ์ ์๋๋ก ๋์์ฃผ์๊ฒ ์ต๋๊น?
ํ์ฌ ์์ ์ฌํญ์ด ์๋ "html2canvas": "^1.0.0-rc.1"์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@niklasvh๋ , ์๋ ํ์ธ์, ๋ฌธ์ #1374์ ๋ํ ์์ ์ฌํญ์ด ํฌํจ๋ ์ ๋ฒ์ ์ด ์ธ์ ์ถ์๋๋์ง ์๋ ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ณ ์ณค๋ค!!
node_modules/html2canvas/dist/html2canvas.js
์ด๊ธฐif (rule && rule.cssText)
if (rule && typeof rule.cssText === 'string')
๋ณ๊ฒฝํฉ๋๋ค.์ด๊ฒ์ IE11์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. :)