Skip to content

Commit 7e6b5ed

Browse files
author
Wout
committed
Merge pull request svgdotjs#200 from pklingem/master
add class manipulation functions to Element
2 parents 8e44d11 + c13717a commit 7e6b5ed

File tree

4 files changed

+170
-6
lines changed

4 files changed

+170
-6
lines changed

dist/svg.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* svg.js 1.0.0-rc.6-1-g1286e3d - svg inventor regex default color array pointarray patharray number viewbox bbox rbox element parent container fx relative event defs group arrange mask clip gradient pattern doc shape use rect ellipse line poly path image text textpath nested hyperlink sugar set data memory loader helpers - svgjs.com/license */
1+
/* svg.js 1.0.0-rc.6-8-g63d8846 - svg inventor regex default color array pointarray patharray number viewbox bbox rbox element parent container fx relative event defs group arrange mask clip gradient pattern doc shape use rect ellipse line poly path image text textpath nested hyperlink sugar set data memory loader helpers - svgjs.com/license */
22
;(function() {
33

44
this.SVG = function(element) {
@@ -1317,6 +1317,49 @@
13171317
, toString: function() {
13181318
return this.attr('id')
13191319
}
1320+
// Return array of classes on the node
1321+
, classes: function() {
1322+
var classAttr = this.node.getAttribute('class')
1323+
if (classAttr === null) {
1324+
return []
1325+
} else {
1326+
return classAttr.trim().split(/\s+/)
1327+
}
1328+
}
1329+
// Return true if class exists on the node, false otherwise
1330+
, hasClass: function(className) {
1331+
return this.classes().indexOf(className) != -1
1332+
}
1333+
// Add class to the node
1334+
, addClass: function(className) {
1335+
var classArray
1336+
if (!(this.hasClass(className))) {
1337+
classArray = this.classes()
1338+
classArray.push(className)
1339+
this.node.setAttribute('class', classArray.join(' '))
1340+
}
1341+
return this
1342+
}
1343+
// Remove class from the node
1344+
, removeClass: function(className) {
1345+
var classArray
1346+
if (this.hasClass(className)) {
1347+
classArray = this.classes().filter(function(c) {
1348+
return c != className
1349+
})
1350+
this.node.setAttribute('class', classArray.join(' '))
1351+
}
1352+
return this
1353+
}
1354+
// Toggle the presence of a class on the node
1355+
, toggleClass: function(className) {
1356+
if (this.hasClass(className)) {
1357+
this.removeClass(className)
1358+
} else {
1359+
this.addClass(className)
1360+
}
1361+
return this
1362+
}
13201363
// Private: find svg parent by instance
13211364
, _parent: function(parent) {
13221365
var element = this
@@ -1329,6 +1372,7 @@
13291372
}
13301373
})
13311374

1375+
13321376
SVG.Parent = SVG.invent({
13331377
// Initialize node
13341378
create: function(element) {

dist/svg.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/spec/element.js

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,86 @@ describe('Element', function() {
315315
expect(element).toBe(circle)
316316
})
317317
})
318-
319-
})
320318

319+
describe('classes()', function() {
320+
it('returns an array of classes on the node', function() {
321+
var element = draw.rect(100,100)
322+
element.node.setAttribute('class', 'one two')
323+
expect(element.classes()).toEqual(['one', 'two'])
324+
})
325+
})
326+
327+
describe('hasClass()', function() {
328+
it('returns true if the node has the class', function() {
329+
var element = draw.rect(100,100)
330+
element.node.setAttribute('class', 'one')
331+
expect(element.hasClass('one')).toBeTruthy()
332+
})
333+
334+
it('returns false if the node does not have the class', function() {
335+
var element = draw.rect(100,100)
336+
element.node.setAttribute('class', 'one')
337+
expect(element.hasClass('two')).toBeFalsy()
338+
})
339+
})
340+
341+
describe('addClass()', function() {
342+
it('adds the class to the node', function() {
343+
var element = draw.rect(100,100)
344+
element.addClass('one')
345+
expect(element.hasClass('one')).toBeTruthy()
346+
})
347+
348+
it('does not add duplicate classes', function() {
349+
var element = draw.rect(100,100)
350+
element.addClass('one')
351+
element.addClass('one')
352+
expect(element.node.getAttribute('class')).toEqual('one')
353+
})
354+
355+
it('returns the svg instance', function() {
356+
var element = draw.rect(100,100)
357+
expect(element.addClass('one')).toEqual(element)
358+
})
359+
})
360+
361+
describe('removeClass()', function() {
362+
it('removes the class from the node when the class exists', function() {
363+
var element = draw.rect(100,100)
364+
element.addClass('one')
365+
element.removeClass('one')
366+
expect(element.hasClass('one')).toBeFalsy()
367+
})
368+
369+
it('does nothing when the class does not exist', function() {
370+
var element = draw.rect(100,100)
371+
element.removeClass('one')
372+
expect(element.hasClass('one')).toBeFalsy()
373+
})
374+
375+
it('returns the element', function() {
376+
var element = draw.rect(100,100)
377+
expect(element.removeClass('one')).toEqual(element)
378+
})
379+
})
321380

381+
describe('toggleClass()', function() {
382+
it('adds the class when it does not already exist', function(){
383+
var element = draw.rect(100,100)
384+
element.toggleClass('one')
385+
expect(element.hasClass('one')).toBeTruthy()
386+
})
322387

388+
it('removes the class when it already exists', function(){
389+
var element = draw.rect(100,100)
390+
element.addClass('one')
391+
element.toggleClass('one')
392+
expect(element.hasClass('one')).toBeFalsy()
393+
})
323394

395+
it('returns the svg instance', function() {
396+
var element = draw.rect(100,100)
397+
expect(element.toggleClass('one')).toEqual(element)
398+
})
399+
})
400+
})

src/element.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,49 @@ SVG.Element = SVG.invent({
341341
, toString: function() {
342342
return this.attr('id')
343343
}
344+
// Return array of classes on the node
345+
, classes: function() {
346+
var classAttr = this.node.getAttribute('class')
347+
if (classAttr === null) {
348+
return []
349+
} else {
350+
return classAttr.trim().split(/\s+/)
351+
}
352+
}
353+
// Return true if class exists on the node, false otherwise
354+
, hasClass: function(className) {
355+
return this.classes().indexOf(className) != -1
356+
}
357+
// Add class to the node
358+
, addClass: function(className) {
359+
var classArray
360+
if (!(this.hasClass(className))) {
361+
classArray = this.classes()
362+
classArray.push(className)
363+
this.node.setAttribute('class', classArray.join(' '))
364+
}
365+
return this
366+
}
367+
// Remove class from the node
368+
, removeClass: function(className) {
369+
var classArray
370+
if (this.hasClass(className)) {
371+
classArray = this.classes().filter(function(c) {
372+
return c != className
373+
})
374+
this.node.setAttribute('class', classArray.join(' '))
375+
}
376+
return this
377+
}
378+
// Toggle the presence of a class on the node
379+
, toggleClass: function(className) {
380+
if (this.hasClass(className)) {
381+
this.removeClass(className)
382+
} else {
383+
this.addClass(className)
384+
}
385+
return this
386+
}
344387
// Private: find svg parent by instance
345388
, _parent: function(parent) {
346389
var element = this
@@ -351,4 +394,4 @@ SVG.Element = SVG.invent({
351394
return element
352395
}
353396
}
354-
})
397+
})

0 commit comments

Comments
 (0)