From fb2ec9c9fb7e3fac65f8aa184ceb8f5a07157e86 Mon Sep 17 00:00:00 2001 From: MoyuScript <i@moyu.moe> Date: Mon, 18 Jul 2011 00:39:56 +0300 Subject: [PATCH] Skipping visibility:hidden and display:none elements --- build/html2canvas.min.js | 4 ++-- src/Core.js | 4 ++-- src/Draw.js | 2 +- src/Traversing.js | 16 ++++++++------- tests/visible-elements.html | 39 +++++++++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 tests/visible-elements.html diff --git a/build/html2canvas.min.js b/build/html2canvas.min.js index d00bf9b..79003ef 100644 --- a/build/html2canvas.min.js +++ b/build/html2canvas.min.js @@ -6,7 +6,7 @@ * Released under MIT License */ -function html2canvas(a,b){this.opts=this.extendObj(b||{},{logging:!1,ready:function(a){document.body.appendChild(a)},iframeDefault:"default",flashCanvasPath:"http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js",renderViewport:!1,reorderZ:!0});this.element=a;this.imagesLoaded=0;this.images=[];this.fontData=[];this.numDraws=0;this.contextStacks=[];this.ignoreElements="IFRAME|OBJECT|PARAM";this.needReorder=!1;this.blockElements=/(BR|PARAM)/;this.ignoreRe=RegExp("("+this.ignoreElements+ +function html2canvas(a,b){this.opts=this.extendObj(b||{},{logging:!1,ready:function(a){document.body.appendChild(a.canvas)},iframeDefault:"default",flashCanvasPath:"http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js",renderViewport:!1,reorderZ:!0});this.element=a;this.imagesLoaded=0;this.images=[];this.fontData=[];this.numDraws=0;this.contextStacks=[];this.ignoreElements="IFRAME|OBJECT|PARAM";this.needReorder=!1;this.blockElements=/(BR|PARAM)/;this.ignoreRe=RegExp("("+this.ignoreElements+ ")");this.useRangeBounds=!1;this.init();return this}html2canvas.prototype.init=function(){var a=this;(this.ctx=new this.stackingContext($(document).width(),$(document).height()))?(this.canvas=this.ctx.canvas,this.log("Finding background images"),this.getImages(this.element),this.log("Finding images"),this.each(document.images,function(b,c){a.preloadImage(a.getAttr(c,"src"))}),this.images.length==0&&this.start()):this.log("Canvas not available")}; html2canvas.prototype.start=function(){if(this.images.length==0||this.imagesLoaded==this.images.length/2)this.log("Started parsing"),this.bodyOverflow=document.getElementsByTagName("body")[0].style.overflow,document.getElementsByTagName("body")[0].style.overflow="hidden",this.parseElement(this.element,this.newElement(this.element,this.ctx)||this.ctx)}; html2canvas.prototype.stackingContext=function(){this.canvas=document.createElement("canvas");this.canvas.width=$(document).width();this.canvas.height=$(document).height();if(this.canvas.getContext)this.ctx=this.canvas.getContext("2d");this.ctx.textBaseline="bottom";return this.ctx}; @@ -36,7 +36,7 @@ html2canvas.prototype.fontMetrics=function(a,b){var c=this.fontData.indexOf(a+"- padding:0});e.appendChild(document.createTextNode("Hidden Text"));c.appendChild(e);c.appendChild(d);var g=d.offsetTop-e.offsetTop+1;c.removeChild(e);c.appendChild(document.createTextNode("Hidden Text"));$(c).css("line-height","normal");$(d).css("vertical-align","super");d={baseline:g,lineWidth:1,middle:d.offsetTop-c.offsetTop+1};this.fontData.push(a+"-"+b);this.fontData.push(d);$(c).remove();return d}; html2canvas.prototype.textTransform=function(a,b){switch(b){case "lowercase":return a.toLowerCase();case "capitalize":return a.replace(/(^|\s|:|-|\(|\))([a-z])/g,function(a,b,e){return b+e.toUpperCase()});case "uppercase":return a.toUpperCase();default:return a}};html2canvas.prototype.trim=function(a){return a.replace(/^\s*/,"").replace(/\s*$/,"")}; html2canvas.prototype.parseElement=function(a,b){var c=this;this.each(a.children,function(a,e){c.parsing(e,{ctx:b})});this.canvasRenderer(this.contextStacks);this.finish()}; -html2canvas.prototype.parsing=function(a,b){var c=this,b=this.newElement(a,b)||b,d=b.ctx;if(!this.ignoreRe.test(a.nodeName)){var e=this.contentsInZ(a);e.length==1?e[0].nodeType==1?this.parsing(e[0],b):e[0].nodeType==3&&this.newText(a,e[0],b.ctx):this.each(e,function(e,f){f.nodeType==1?c.parsing(f,b):f.nodeType==3&&c.newText(a,f,d)})}};html2canvas.prototype.log=function(){}; +html2canvas.prototype.parsing=function(a,b){if(this.getCSS(a,"display")!="none"&&this.getCSS(a,"visibility")!="hidden"){var c=this,b=this.newElement(a,b)||b,d=b.ctx;if(!this.ignoreRe.test(a.nodeName)){var e=this.contentsInZ(a);e.length==1?e[0].nodeType==1?this.parsing(e[0],b):e[0].nodeType==3&&this.newText(a,e[0],b.ctx):this.each(e,function(e,f){f.nodeType==1?c.parsing(f,b):f.nodeType==3&&c.newText(a,f,d)})}}};html2canvas.prototype.log=function(){}; html2canvas.prototype.getBounds=function(a){window.scroll(0,0);if(a.getBoundingClientRect)return a=a.getBoundingClientRect(),a.top=a.top,a.left=a.left,a;else{var b=$(a).offset();return{left:b.left+parseInt(this.getCSS(a,"border-left-width"),10),top:b.top+parseInt(this.getCSS(a,"border-top-width"),10),width:$(a).innerWidth(),height:$(a).innerHeight()}}};html2canvas.prototype.each=function(a,b){for(var b=b||function(){},c=0;c<a.length;c++)b(c,a[c])};html2canvas.prototype.contentsInZ=function(a){return $(a).contents()}; html2canvas.prototype.getAttr=function(a,b){return a.getAttribute(b)};html2canvas.prototype.extendObj=function(a,b){for(var c in a)b[c]=a[c];return b};html2canvas.prototype.leadingZero=function(a,b){var c="000000000"+a;return c.substr(c.length-b)}; html2canvas.prototype.formatZ=function(a,b,c,d){c||(c="0");if(b!="static"&&c.charAt(0)=="0")this.needReorder=!0,c="1"+c.slice(1);if(a=="auto")if(a=this.getCSS(d,"position"),a!="static"&&typeof a!="undefined")a=0;else return c;b=this.leadingZero(this.numDraws,9);a=this.leadingZero(a+1,9);return c+""+a+""+b};html2canvas.prototype.getContents=function(a){return a.nodeName=="iframe"?a.contentDocument||a.contentWindow.document:a.childNodes};html2canvas.prototype.getCSS=function(a,b){return $(a).css(b)}; diff --git a/src/Core.js b/src/Core.js index 8259eb9..1cbaca3 100644 --- a/src/Core.js +++ b/src/Core.js @@ -10,8 +10,8 @@ function html2canvas(el, userOptions) { this.opts = this.extendObj(options, { logging: false, - ready: function (canvas) { - document.body.appendChild(canvas); + ready: function (stack) { + document.body.appendChild(stack.canvas); }, iframeDefault: "default", flashCanvasPath: "http://html2canvas.hertzen.com/external/flashcanvas/flashcanvas.js", diff --git a/src/Draw.js b/src/Draw.js index 4b7d23b..ecf96f2 100644 --- a/src/Draw.js +++ b/src/Draw.js @@ -3,7 +3,7 @@ html2canvas.prototype.newElement = function(el,parentStack){ - + var bounds = this.getBounds(el); var x = bounds.left; diff --git a/src/Traversing.js b/src/Traversing.js index 4880902..4ddadd7 100644 --- a/src/Traversing.js +++ b/src/Traversing.js @@ -2,10 +2,10 @@ html2canvas.prototype.parseElement = function(element,ctx){ var _ = this; - this.each(element.children,function(index,el){ + this.each(element.children,function(index,el){ _.parsing(el,{ ctx:ctx - }); + }); }); this.canvasRenderer(this.contextStacks); @@ -15,10 +15,12 @@ html2canvas.prototype.parseElement = function(element,ctx){ html2canvas.prototype.parsing = function(el,stack){ + + if (this.getCSS(el,'display') != "none" && this.getCSS(el,'visibility')!="hidden"){ + + var _ = this; - var _ = this; - - //if (!this.blockElements.test(el.nodeName)){ + //if (!this.blockElements.test(el.nodeName)){ stack = this.newElement(el,stack) || stack; @@ -61,7 +63,7 @@ html2canvas.prototype.parsing = function(el,stack){ } } - - // } + } +// } } \ No newline at end of file diff --git a/tests/visible-elements.html b/tests/visible-elements.html new file mode 100644 index 0000000..92212ff --- /dev/null +++ b/tests/visible-elements.html @@ -0,0 +1,39 @@ +<!-- +* @author Niklas von Hertzen <niklas at hertzen.com> +* @created 16.7.2011 +* @website http://hertzen.com +--> +<!DOCTYPE html> +<html> + <head> + <title>Visible elements tests</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <link href="#" type="text/css" rel="stylesheet"> + + <script type="text/javascript" src="../external/jquery-1.6.2.min.js"></script> + <script type="text/javascript" src="../build/html2canvas.js"></script> + <script type="text/javascript" src="../build/jquery.plugin.html2canvas.js"></script> + <script type="text/javascript"> + $(window).ready(function() { + new html2canvas($('body').get(0)); + }); + </script> + + <style> + div{ + border:2px solid black; + } + </style> + + </head> + <body> + <h1>Display:none and visible:hidden tests</h1> + <div>This should be visible </div> + <div style="display:none">display:none, This should be <b>hidden</b></div> + <div style="visibility:hidden">visibility:hidden, This should be <b>hidden</b></div> + <hr /> + <div style="display:none">display:none, This should be <b>hidden</b></div> + <div style="visibility:hidden">visibility:hidden, This should be <b>hidden</b></div> + + </body> +</html>