From 5a72b487125beaa6b7bd81584fb9d35c4ffc43be Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Tue, 13 Nov 2018 21:10:27 +0100 Subject: Round up everything for the last 2.x release ### Fixed - fixed calling `parent()` on `documentFragment`s children (#927) - parser is not focusable anymore (#908) - `SVG.Element.click(null)` correctly unbinds the event (#878) - fix memory leak (#905) ### Added - `SVG.Set` now accepts another Set as input (#893) - `on()/off()` accepts multiple event names as input (backport from 3.0) --- dist/svg.js | 225 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 112 insertions(+), 113 deletions(-) (limited to 'dist/svg.js') diff --git a/dist/svg.js b/dist/svg.js index 0a5c1e3..f90eb55 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -1,12 +1,12 @@ /*! * svg.js - A lightweight library for manipulating and animating SVG. -* @version 2.6.6 +* @version 2.7.0 * https://svgdotjs.github.io/ * * @copyright Wout Fierens * @license MIT * -* BUILT: Tue Nov 13 2018 17:12:15 GMT+0100 (CET) +* BUILT: Tue Nov 13 2018 21:10:01 GMT+0100 (GMT+01:00) */; (function(root, factory) { /* istanbul ignore next */ @@ -162,7 +162,7 @@ SVG.prepare = function() { // Create parser object SVG.parser = { body: body || document.documentElement - , draw: draw.style('opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden').node + , draw: draw.style('opacity:0;position:absolute;left:-100%;top:-100%;overflow:hidden').attr('focusable', 'false').node , poly: draw.polyline().node , path: draw.path().node , native: SVG.create('svg') @@ -1032,6 +1032,7 @@ SVG.Element = SVG.invent({ // make stroke value accessible dynamically this._stroke = SVG.defaults.attrs.stroke this._event = null + this._events = {} // initialize data object this.dom = {} @@ -1040,6 +1041,7 @@ SVG.Element = SVG.invent({ if (this.node = node) { this.type = node.nodeName this.node.instance = this + this._events = node._events || {} // store current attribute value this._stroke = node.getAttribute('stroke') || this._stroke @@ -3400,146 +3402,142 @@ SVG.ViewBox = SVG.invent({ }) // Add events to elements -;[ 'click' - , 'dblclick' - , 'mousedown' - , 'mouseup' - , 'mouseover' - , 'mouseout' - , 'mousemove' - // , 'mouseenter' -> not supported by IE - // , 'mouseleave' -> not supported by IE - , 'touchstart' - , 'touchmove' - , 'touchleave' - , 'touchend' - , 'touchcancel' ].forEach(function(event) { - - // add event to SVG.Element - SVG.Element.prototype[event] = function(f) { - // bind event to element rather than element node - SVG.on(this.node, event, f) - return this - } -}) -// Initialize listeners stack -SVG.listeners = [] -SVG.handlerMap = [] +;[ 'click', + 'dblclick', + 'mousedown', + 'mouseup', + 'mouseover', + 'mouseout', + 'mousemove', + 'mouseenter', + 'mouseleave', + 'touchstart', + 'touchmove', + 'touchleave', + 'touchend', + 'touchcancel' ].forEach(function (event) { + // add event to SVG.Element + SVG.Element.prototype[event] = function (f) { + // bind event to element rather than element node + if (f == null) { + SVG.off(this, event) + } else { + SVG.on(this, event, f) + } + return this + } + }) + SVG.listenerId = 0 // Add event binder in the SVG namespace -SVG.on = function(node, event, listener, binding, options) { - // create listener, get object-index - var l = listener.bind(binding || node.instance || node) - , index = (SVG.handlerMap.indexOf(node) + 1 || SVG.handlerMap.push(node)) - 1 - , ev = event.split('.')[0] - , ns = event.split('.')[1] || '*' +SVG.on = function (node, events, listener, binding, options) { + var l = listener.bind(binding || node) + var n = node instanceof SVG.Element ? node.node : node + // ensure instance object for nodes which are not adopted + n.instance = n.instance || {_events: {}} - // ensure valid object - SVG.listeners[index] = SVG.listeners[index] || {} - SVG.listeners[index][ev] = SVG.listeners[index][ev] || {} - SVG.listeners[index][ev][ns] = SVG.listeners[index][ev][ns] || {} + var bag = n.instance._events - if(!listener._svgjsListenerId) - listener._svgjsListenerId = ++SVG.listenerId + // add id to listener + if (!listener._svgjsListenerId) { listener._svgjsListenerId = ++SVG.listenerId } - // reference listener - SVG.listeners[index][ev][ns][listener._svgjsListenerId] = l + events.split(SVG.regex.delimiter).forEach(function (event) { + var ev = event.split('.')[0] + var ns = event.split('.')[1] || '*' - // add listener - node.addEventListener(ev, l, options || false) + // ensure valid object + bag[ev] = bag[ev] || {} + bag[ev][ns] = bag[ev][ns] || {} + + // reference listener + bag[ev][ns][listener._svgjsListenerId] = l + + // add listener + n.addEventListener(ev, l, options || false) + }) } // Add event unbinder in the SVG namespace -SVG.off = function(node, event, listener) { - var index = SVG.handlerMap.indexOf(node) - , ev = event && event.split('.')[0] - , ns = event && event.split('.')[1] - , namespace = '' +SVG.off = function (node, events, listener, options) { + var n = node instanceof SVG.Element ? node.node : node + if (!n.instance) return - if(index == -1) return - - if (listener) { - if(typeof listener == 'function') listener = listener._svgjsListenerId - if(!listener) return + // listener can be a function or a number + if (typeof listener === 'function') { + listener = listener._svgjsListenerId + if (!listener) return + } - // remove listener reference - if (SVG.listeners[index][ev] && SVG.listeners[index][ev][ns || '*']) { - // remove listener - node.removeEventListener(ev, SVG.listeners[index][ev][ns || '*'][listener], false) + var bag = n.instance._events - delete SVG.listeners[index][ev][ns || '*'][listener] - } + ;(events || '').split(SVG.regex.delimiter).forEach(function (event) { + var ev = event && event.split('.')[0] + var ns = event && event.split('.')[1] + var namespace, l - } else if (ns && ev) { - // remove all listeners for a namespaced event - if (SVG.listeners[index][ev] && SVG.listeners[index][ev][ns]) { - for (listener in SVG.listeners[index][ev][ns]) - SVG.off(node, [ev, ns].join('.'), listener) + if (listener) { + // remove listener reference + if (bag[ev] && bag[ev][ns || '*']) { + // removeListener + n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false) - delete SVG.listeners[index][ev][ns] - } + delete bag[ev][ns || '*'][listener] + } + } else if (ev && ns) { + // remove all listeners for a namespaced event + if (bag[ev] && bag[ev][ns]) { + for (l in bag[ev][ns]) { SVG.off(n, [ev, ns].join('.'), l) } - } else if (ns){ - // remove all listeners for a specific namespace - for(event in SVG.listeners[index]){ - for(namespace in SVG.listeners[index][event]){ - if(ns === namespace){ - SVG.off(node, [event, ns].join('.')) - } + delete bag[ev][ns] + } + } else if (ns) { + // remove all listeners for a specific namespace + for (event in bag) { + for (namespace in bag[event]) { + if (ns === namespace) { SVG.off(n, [event, ns].join('.')) } } - } + } + } else if (ev) { + // remove all listeners for the event + if (bag[ev]) { + for (namespace in bag[ev]) { SVG.off(n, [ev, namespace].join('.')) } - } else if (ev) { - // remove all listeners for the event - if (SVG.listeners[index][ev]) { - for (namespace in SVG.listeners[index][ev]) - SVG.off(node, [ev, namespace].join('.')) + delete bag[ev] + } + } else { + // remove all listeners on a given node + for (event in bag) { SVG.off(n, event) } - delete SVG.listeners[index][ev] + n.instance._events = {} } - - } else { - // remove all listeners on a given node - for (event in SVG.listeners[index]) - SVG.off(node, event) - - delete SVG.listeners[index] - delete SVG.handlerMap[index] - - } + }) } -// SVG.extend(SVG.Element, { // Bind given event to listener - on: function(event, listener, binding, options) { - SVG.on(this.node, event, listener, binding, options) - + on: function (event, listener, binding, options) { + SVG.on(this, event, listener, binding, options) return this - } + }, // Unbind event from listener -, off: function(event, listener) { + off: function (event, listener) { SVG.off(this.node, event, listener) - return this - } - // Fire given event -, fire: function(event, data) { - + }, + fire: function (event, data) { // Dispatch event - if(event instanceof window.Event){ - this.node.dispatchEvent(event) - }else{ - this.node.dispatchEvent(event = new SVG.CustomEvent(event, {detail:data, cancelable: true})) + if (event instanceof window.Event) { + this.node.dispatchEvent(event) + } else { + this.node.dispatchEvent(event = new window.CustomEvent(event, {detail: data, cancelable: true})) } - this._event = event return this - } -, event: function() { + }, + event: function() { return this._event } }) @@ -5141,8 +5139,11 @@ SVG.extend(SVG.Parent, SVG.Text, SVG.Tspan, SVG.FX, { SVG.Set = SVG.invent({ // Initialize create: function(members) { - // Set initial state - Array.isArray(members) ? this.members = members : this.clear() + if (members instanceof SVG.Set) { + this.members = members.members.slice() + } else { + Array.isArray(members) ? this.members = members : this.clear() + } } // Add class methods @@ -5283,8 +5284,6 @@ SVG.Set.inherit = function() { } }) } - - SVG.extend(SVG.Element, { -- cgit v1.2.3