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() { if(!this.node.parentNode || this.node.parentNode.nodeName == '#document' || this.node.parentNode.nodeName == '#document-fragment') return null return this.node.parentNode } // Fix for possible sub-pixel offset. See: // https://bugzilla.mozilla.org/show_bug.cgi?id=608812 , spof: function() { 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 } , clear: function() { // remove children while(this.node.hasChildNodes()) this.node.removeChild(this.node.lastChild) // remove defs reference delete this._defs // add back parser if(!SVG.parser.draw.parentNode) this.node.appendChild(SVG.parser.draw) return this } , clone: function (parent) { // write dom data to the dom so the clone can pickup the data this.writeDataToDom() // get reference to node var node = this.node // clone element and assign new id var clone = assignNewId(node.cloneNode(true)) // insert the clone in the given parent or after myself if(parent) { (parent.node || parent).appendChild(clone.node) } else { node.parentNode.insertBefore(clone.node, node.nextSibling) } return clone } } })