removed last jQuery dependencies

should be fully jQuery free now!
This commit is contained in:
Niklas von Hertzen 2012-06-26 01:17:03 +03:00
parent 9f76f94a82
commit 343b86705f
2 changed files with 291 additions and 236 deletions

View File

@ -1,233 +1,270 @@
/* /*
html2canvas @VERSION@ <http://html2canvas.hertzen.com> html2canvas @VERSION@ <http://html2canvas.hertzen.com>
Copyright (c) 2011 Niklas von Hertzen. All rights reserved. Copyright (c) 2011 Niklas von Hertzen. All rights reserved.
http://www.twitter.com/niklasvh http://www.twitter.com/niklasvh
Released under MIT License Released under MIT License
*/ */
"use strict"; "use strict";
var _html2canvas = {}, var _html2canvas = {},
previousElement, previousElement,
computedCSS, computedCSS,
html2canvas; html2canvas;
function h2clog(a) { function h2clog(a) {
if (_html2canvas.logging && window.console && window.console.log) { if (_html2canvas.logging && window.console && window.console.log) {
window.console.log(a); window.console.log(a);
} }
} }
_html2canvas.Util = {}; _html2canvas.Util = {};
_html2canvas.Util.backgroundImage = function (src) { _html2canvas.Util.backgroundImage = function (src) {
if (/data:image\/.*;base64,/i.test( src ) || /^(-webkit|-moz|linear-gradient|-o-)/.test( src )) { if (/data:image\/.*;base64,/i.test( src ) || /^(-webkit|-moz|linear-gradient|-o-)/.test( src )) {
return src; return src;
} }
if (src.toLowerCase().substr( 0, 5 ) === 'url("') { if (src.toLowerCase().substr( 0, 5 ) === 'url("') {
src = src.substr( 5 ); src = src.substr( 5 );
src = src.substr( 0, src.length - 2 ); src = src.substr( 0, src.length - 2 );
} else { } else {
src = src.substr( 4 ); src = src.substr( 4 );
src = src.substr( 0, src.length - 1 ); src = src.substr( 0, src.length - 1 );
} }
return src; return src;
}; };
_html2canvas.Util.Bounds = function getBounds (el) { _html2canvas.Util.Bounds = function getBounds (el) {
var clientRect, var clientRect,
bounds = {}; bounds = {};
if (el.getBoundingClientRect){ if (el.getBoundingClientRect){
clientRect = el.getBoundingClientRect(); clientRect = el.getBoundingClientRect();
// TODO add scroll position to bounds, so no scrolling of window necessary // TODO add scroll position to bounds, so no scrolling of window necessary
bounds.top = clientRect.top; bounds.top = clientRect.top;
bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height); bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height);
bounds.left = clientRect.left; bounds.left = clientRect.left;
// older IE doesn't have width/height, but top/bottom instead // older IE doesn't have width/height, but top/bottom instead
bounds.width = clientRect.width || (clientRect.right - clientRect.left); bounds.width = clientRect.width || (clientRect.right - clientRect.left);
bounds.height = clientRect.height || (clientRect.bottom - clientRect.top); bounds.height = clientRect.height || (clientRect.bottom - clientRect.top);
return bounds; return bounds;
} }
}; };
_html2canvas.Util.getCSS = function (el, attribute) { _html2canvas.Util.getCSS = function (el, attribute) {
// return $(el).css(attribute); // return $(el).css(attribute);
var val; var val;
function toPX( attribute, val ) { function toPX( attribute, val ) {
var rsLeft = el.runtimeStyle && el.runtimeStyle[ attribute ], var rsLeft = el.runtimeStyle && el.runtimeStyle[ attribute ],
left, left,
style = el.style; style = el.style;
// Check if we are not dealing with pixels, (Opera has issues with this) // Check if we are not dealing with pixels, (Opera has issues with this)
// Ported from jQuery css.js // Ported from jQuery css.js
// From the awesome hack by Dean Edwards // From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number // If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels // but a number that has a weird ending, we need to convert it to pixels
if ( !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test( val ) && /^-?\d/.test( val ) ) { if ( !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test( val ) && /^-?\d/.test( val ) ) {
// Remember the original values // Remember the original values
left = style.left; left = style.left;
// Put in the new values to get a computed value out // Put in the new values to get a computed value out
if ( rsLeft ) { if ( rsLeft ) {
el.runtimeStyle.left = el.currentStyle.left; el.runtimeStyle.left = el.currentStyle.left;
} }
style.left = attribute === "fontSize" ? "1em" : (val || 0); style.left = attribute === "fontSize" ? "1em" : (val || 0);
val = style.pixelLeft + "px"; val = style.pixelLeft + "px";
// Revert the changed values // Revert the changed values
style.left = left; style.left = left;
if ( rsLeft ) { if ( rsLeft ) {
el.runtimeStyle.left = rsLeft; el.runtimeStyle.left = rsLeft;
} }
} }
if (!/^(thin|medium|thick)$/i.test( val )) { if (!/^(thin|medium|thick)$/i.test( val )) {
return Math.round(parseFloat( val )) + "px"; return Math.round(parseFloat( val )) + "px";
} }
return val; return val;
} }
if ( window.getComputedStyle ) { if ( window.getComputedStyle ) {
if ( previousElement !== el ) { if ( previousElement !== el ) {
computedCSS = document.defaultView.getComputedStyle(el, null); computedCSS = document.defaultView.getComputedStyle(el, null);
} }
val = computedCSS[ attribute ]; val = computedCSS[ attribute ];
if ( attribute === "backgroundPosition" ) { if ( attribute === "backgroundPosition" ) {
val = (val.split(",")[0] || "0 0").split(" "); val = (val.split(",")[0] || "0 0").split(" ");
val[ 0 ] = ( val[0].indexOf( "%" ) === -1 ) ? toPX( attribute + "X", val[ 0 ] ) : val[ 0 ]; val[ 0 ] = ( val[0].indexOf( "%" ) === -1 ) ? toPX( attribute + "X", val[ 0 ] ) : val[ 0 ];
val[ 1 ] = ( val[1] === undefined ) ? val[0] : val[1]; // IE 9 doesn't return double digit always val[ 1 ] = ( val[1] === undefined ) ? val[0] : val[1]; // IE 9 doesn't return double digit always
val[ 1 ] = ( val[1].indexOf( "%" ) === -1 ) ? toPX( attribute + "Y", val[ 1 ] ) : val[ 1 ]; val[ 1 ] = ( val[1].indexOf( "%" ) === -1 ) ? toPX( attribute + "Y", val[ 1 ] ) : val[ 1 ];
} }
} else if ( el.currentStyle ) { } else if ( el.currentStyle ) {
// IE 9> // IE 9>
if (attribute === "backgroundPosition") { if (attribute === "backgroundPosition") {
// Older IE uses -x and -y // Older IE uses -x and -y
val = [ toPX( attribute + "X", el.currentStyle[ attribute + "X" ] ), toPX( attribute + "Y", el.currentStyle[ attribute + "Y" ] ) ]; val = [ toPX( attribute + "X", el.currentStyle[ attribute + "X" ] ), toPX( attribute + "Y", el.currentStyle[ attribute + "Y" ] ) ];
} else { } else {
val = toPX( attribute, el.currentStyle[ attribute ] ); val = toPX( attribute, el.currentStyle[ attribute ] );
if (/^(border)/i.test( attribute ) && /^(medium|thin|thick)$/i.test( val )) { if (/^(border)/i.test( attribute ) && /^(medium|thin|thick)$/i.test( val )) {
switch (val) { switch (val) {
case "thin": case "thin":
val = "1px"; val = "1px";
break; break;
case "medium": case "medium":
val = "0px"; // this is wrong, it should be 3px but IE uses medium for no border as well.. TODO find a work around val = "0px"; // this is wrong, it should be 3px but IE uses medium for no border as well.. TODO find a work around
break; break;
case "thick": case "thick":
val = "5px"; val = "5px";
break; break;
} }
} }
} }
} }
return val; return val;
//return $(el).css(attribute); //return $(el).css(attribute);
}; };
_html2canvas.Util.BackgroundPosition = function ( el, bounds, image ) { _html2canvas.Util.BackgroundPosition = function ( el, bounds, image ) {
// TODO add support for multi image backgrounds // TODO add support for multi image backgrounds
var bgposition = _html2canvas.Util.getCSS( el, "backgroundPosition" ) , var bgposition = _html2canvas.Util.getCSS( el, "backgroundPosition" ) ,
topPos, topPos,
left, left,
percentage, percentage,
val; val;
if (bgposition.length === 1){ if (bgposition.length === 1){
val = bgposition; val = bgposition;
bgposition = []; bgposition = [];
bgposition[0] = val; bgposition[0] = val;
bgposition[1] = val; bgposition[1] = val;
} }
if (bgposition[0].toString().indexOf("%") !== -1){ if (bgposition[0].toString().indexOf("%") !== -1){
percentage = (parseFloat(bgposition[0])/100); percentage = (parseFloat(bgposition[0])/100);
left = ((bounds.width * percentage)-(image.width*percentage)); left = ((bounds.width * percentage)-(image.width*percentage));
}else{ }else{
left = parseInt(bgposition[0],10); left = parseInt(bgposition[0],10);
} }
if (bgposition[1].toString().indexOf("%") !== -1){ if (bgposition[1].toString().indexOf("%") !== -1){
percentage = (parseFloat(bgposition[1])/100); percentage = (parseFloat(bgposition[1])/100);
topPos = ((bounds.height * percentage)-(image.height*percentage)); topPos = ((bounds.height * percentage)-(image.height*percentage));
}else{ }else{
topPos = parseInt(bgposition[1],10); topPos = parseInt(bgposition[1],10);
} }
return { return {
top: topPos, top: topPos,
left: left left: left
}; };
}; };
_html2canvas.Util.Extend = function (options, defaults) { _html2canvas.Util.Extend = function (options, defaults) {
for (var key in options) { for (var key in options) {
if (options.hasOwnProperty(key)) { if (options.hasOwnProperty(key)) {
defaults[key] = options[key]; defaults[key] = options[key];
} }
} }
return defaults; return defaults;
}; };
_html2canvas.Util.Children = function(el) {
// $(el).contents() !== el.childNodes, Opera / IE have issues with that /*
var children; * Derived from jQuery.contents()
try { * Copyright 2010, John Resig
children = $(el).contents(); * Dual licensed under the MIT or GPL Version 2 licenses.
//children = (el.nodeName && el.nodeName.toUpperCase() === "IFRAME") ? el.contentDocument || el.contentWindow.document : el.childNodes ; * http://jquery.org/license
*/
} catch (ex) { _html2canvas.Util.Children = function( elem ) {
h2clog("html2canvas.Util.Children failed with exception: " + ex.message);
children = [];
} var children;
return children; try {
};
children = (elem.nodeName && elem.nodeName.toUpperCase() === "IFRAME") ?
elem.contentDocument || elem.contentWindow.document : (function( array ){
var ret = [];
if ( array !== null ) {
(function( first, second ) {
var i = first.length,
j = 0;
if ( typeof second.length === "number" ) {
for ( var l = second.length; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
})( ret, array );
}
return ret;
})( elem.childNodes );
} catch (ex) {
h2clog("html2canvas.Util.Children failed with exception: " + ex.message);
children = [];
}
return children;
};

View File

@ -440,7 +440,26 @@ _html2canvas.Parse = function ( images, options ) {
return bounds; return bounds;
} }
function elementIndex( el ) {
var i = -1,
count = 1,
childs = el.parentNode.childNodes;
if ( el.parentNode ) {
while( childs[ ++i ] !== el ) {
if ( childs[ i ].nodeType === 1 ) {
count++;
}
}
return count;
} else {
return -1;
}
}
function renderListItem(element, stack, elBounds) { function renderListItem(element, stack, elBounds) {
@ -456,8 +475,7 @@ _html2canvas.Parse = function ( images, options ) {
if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) { if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {
// TODO remove jQuery dependency currentIndex = elementIndex( element );
currentIndex = $(element).index()+1;
switch(type){ switch(type){
case "decimal": case "decimal":
@ -879,7 +897,7 @@ _html2canvas.Parse = function ( images, options ) {
);*/ );*/
// console.log($(el).css('background-image'));
bgw = bounds.width - bgp.left; bgw = bounds.width - bgp.left;
bgh = bounds.height - bgp.top; bgh = bounds.height - bgp.top;
bgsx = bgp.left; bgsx = bgp.left;