Skip to content

Commit

Permalink
Round up everything for the last 2.x release
Browse files Browse the repository at this point in the history
### 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)
  • Loading branch information
Fuzzyma committed Nov 13, 2018
1 parent 05ba3dd commit 5a72b48
Show file tree
Hide file tree
Showing 10 changed files with 311 additions and 533 deletions.
14 changes: 14 additions & 0 deletions CHANGELOG.md
Expand Up @@ -29,6 +29,19 @@ The document follows the conventions described in [“Keep a CHANGELOG”](http:
- fixed a bug in IE11 with `mouseenter` and `mouseleave` -> __TODO!__


## [2.7.0] - 2018-11-13

### 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)


## [2.6.6] - 2018-08-30

### Added
Expand Down Expand Up @@ -640,6 +653,7 @@ The document follows the conventions described in [“Keep a CHANGELOG”](http:


<!-- Headings above link to the releases listed here -->
[2.7.0]: https://github.com/svgdotjs/svg.js/releases/tag/2.7.0
[2.6.6]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.6
[2.6.5]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.5
[2.6.4]: https://github.com/svgdotjs/svg.js/releases/tag/2.6.4
Expand Down
225 changes: 112 additions & 113 deletions 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 <wout@mick-wout.com>
* @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 */
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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 = {}
Expand All @@ -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
Expand Down Expand Up @@ -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
}
})
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -5283,8 +5284,6 @@ SVG.Set.inherit = function() {
}
})
}




SVG.extend(SVG.Element, {
Expand Down
4 changes: 2 additions & 2 deletions dist/svg.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "svg.js",
"version": "2.6.6",
"version": "2.7.0",
"description": "A lightweight library for manipulating and animating SVG.",
"url": "https://svgdotjs.github.io/",
"homepage": "https://svgdotjs.github.io/",
Expand Down

0 comments on commit 5a72b48

Please sign in to comment.