SVG.Doc = SVG.invent({ // Initialize node create: function(element) { if (element) { // ensure the presence of a dom element element = typeof element == 'string' ? document.getElementById(element) : element // If the target is an svg element, use that element as the main wrapper. // This allows svg.js to work with svg documents as well. if (element.nodeName == 'svg') { this.constructor.call(this, element) } else { this.constructor.call(this, SVG.create('svg')) element.appendChild(this.node) this.size('100%', '100%') } // set svg element attributes and ensure defs node this.namespace().defs() } } // Inherit from , inherit: SVG.Container // Add class methods , extend: { // Add namespaces namespace: function() { return this .attr({ xmlns: SVG.ns, version: '1.1' }) .attr('xmlns:xlink', SVG.xlink, SVG.xmlns) .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns) } // Creates and returns defs element , defs: function() { if (!this._defs) { var defs // Find or create a defs element in this instance if (defs = this.node.getElementsByTagName('defs')[0]) this._defs = SVG.adopt(defs) else this._defs = new SVG.Defs // Make sure the defs node is at the end of the stack this.node.appendChild(this._defs.node) } return this._defs } // custom parent method , parent: function() { return this.node.parentNode.nodeName == '#document' ? null : this.node.parentNode } // Fix for possible sub-pixel offset. See: // https://bugzilla.mozilla.org/show_bug.cgi?id=608812 , spof: function(spof) { var pos = this.node.getScreenCTM() if (pos) this .style('left', (-pos.e % 1) + 'px') .style('top', (-pos.f % 1) + 'px') return this } // Removes the doc from the DOM , remove: function() { if(this.parent()) { this.parent().removeChild(this.node); } return this; } } })