Skip to content

Commit 68b1a00

Browse files
committed
fix IE+SVG no classList available error. Based on vuejs#537 by @tyage
1 parent 78fa71c commit 68b1a00

File tree

4 files changed

+44
-50
lines changed

4 files changed

+44
-50
lines changed

src/directives/class.js

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,6 @@
11
var _ = require('../util')
2-
var hasClassList =
3-
typeof document !== 'undefined' &&
4-
'classList' in document.documentElement
5-
6-
/**
7-
* add class for IE9
8-
*
9-
* @param {Element} el
10-
* @param {Strong} cls
11-
*/
12-
13-
var addClass = hasClassList
14-
? function (el, cls) {
15-
el.classList.add(cls)
16-
}
17-
: _.addClass
18-
19-
/**
20-
* remove class for IE9
21-
*
22-
* @param {Element} el
23-
* @param {Strong} cls
24-
*/
25-
26-
var removeClass = hasClassList
27-
? function (el, cls) {
28-
el.classList.remove(cls)
29-
}
30-
: _.removeClass
2+
var addClass = _.addClass
3+
var removeClass = _.removeClass
314

325
module.exports = function (value) {
336
if (this.arg) {

src/transition/css.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
var _ = require('../util')
2+
var addClass = _.addClass
3+
var removeClass = _.removeClass
24
var transDurationProp = _.transitionProp + 'Duration'
35
var animDurationProp = _.animationProp + 'Duration'
46

@@ -53,7 +55,6 @@ function flush () {
5355
function run (job) {
5456

5557
var el = job.el
56-
var classList = el.classList
5758
var data = el.__v_trans
5859
var cls = job.cls
5960
var cb = job.cb
@@ -63,19 +64,19 @@ function run (job) {
6364
if (job.dir > 0) { // ENTER
6465
if (transitionType === 1) {
6566
// trigger transition by removing enter class
66-
classList.remove(cls)
67+
removeClass(el, cls)
6768
// only need to listen for transitionend if there's
6869
// a user callback
6970
if (cb) setupTransitionCb(_.transitionEndEvent)
7071
} else if (transitionType === 2) {
7172
// animations are triggered when class is added
7273
// so we just listen for animationend to remove it.
7374
setupTransitionCb(_.animationEndEvent, function () {
74-
classList.remove(cls)
75+
removeClass(el, cls)
7576
})
7677
} else {
7778
// no transition applicable
78-
classList.remove(cls)
79+
removeClass(el, cls)
7980
if (cb) cb()
8081
}
8182
} else { // LEAVE
@@ -87,11 +88,11 @@ function run (job) {
8788
: _.animationEndEvent
8889
setupTransitionCb(event, function () {
8990
op()
90-
classList.remove(cls)
91+
removeClass(el, cls)
9192
})
9293
} else {
9394
op()
94-
classList.remove(cls)
95+
removeClass(el, cls)
9596
if (cb) cb()
9697
}
9798
}
@@ -167,23 +168,22 @@ function getTransitionType (el, data, className) {
167168
*/
168169

169170
module.exports = function (el, direction, op, data, cb) {
170-
var classList = el.classList
171171
var prefix = data.id || 'v'
172172
var enterClass = prefix + '-enter'
173173
var leaveClass = prefix + '-leave'
174174
// clean up potential previous unfinished transition
175175
if (data.callback) {
176176
_.off(el, data.event, data.callback)
177-
classList.remove(enterClass)
178-
classList.remove(leaveClass)
177+
removeClass(el, enterClass)
178+
removeClass(el, leaveClass)
179179
data.event = data.callback = null
180180
}
181181
if (direction > 0) { // enter
182-
classList.add(enterClass)
182+
addClass(el, enterClass)
183183
op()
184184
push(el, direction, null, enterClass, cb)
185185
} else { // leave
186-
classList.add(leaveClass)
186+
addClass(el, leaveClass)
187187
push(el, direction, op, leaveClass, cb)
188188
}
189189
}

src/util/dom.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,31 +138,39 @@ exports.off = function (el, event, cb) {
138138
}
139139

140140
/**
141-
* Compatibility add class for IE9
141+
* Add class with compatibility for IE & SVG
142142
*
143143
* @param {Element} el
144144
* @param {Strong} cls
145145
*/
146146

147147
exports.addClass = function (el, cls) {
148-
var cur = ' ' + el.className + ' '
149-
if (cur.indexOf(' ' + cls + ' ') < 0) {
150-
el.className = (cur + cls).trim()
148+
if (el.classList) {
149+
el.classList.add(cls)
150+
} else {
151+
var cur = ' ' + (el.getAttribute('class') || '') + ' '
152+
if (cur.indexOf(' ' + cls + ' ') < 0) {
153+
el.setAttribute('class', (cur + cls).trim())
154+
}
151155
}
152156
}
153157

154158
/**
155-
* Compatibility remove class for IE9
159+
* Remove class with compatibility for IE & SVG
156160
*
157161
* @param {Element} el
158162
* @param {Strong} cls
159163
*/
160164

161165
exports.removeClass = function (el, cls) {
162-
var cur = ' ' + el.className + ' '
163-
var tar = ' ' + cls + ' '
164-
while (cur.indexOf(tar) >= 0) {
165-
cur = cur.replace(tar, ' ')
166+
if (el.classList) {
167+
el.classList.remove(cls)
168+
} else {
169+
var cur = ' ' + (el.getAttribute('class') || '') + ' '
170+
var tar = ' ' + cls + ' '
171+
while (cur.indexOf(tar) >= 0) {
172+
cur = cur.replace(tar, ' ')
173+
}
174+
el.setAttribute('class', cur.trim())
166175
}
167-
el.className = cur.trim()
168176
}

test/unit/specs/util/dom_spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,18 @@ if (_.inBrowser) {
114114
_.addClass(el, 'bb')
115115
expect(el.className).toBe('cc bb')
116116
})
117+
118+
it('addClass/removeClass for SVG/IE9', function () {
119+
var el = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
120+
el.setAttribute('class', 'aa bb cc')
121+
_.removeClass(el, 'bb')
122+
expect(el.getAttribute('class')).toBe('aa cc')
123+
_.removeClass(el, 'aa')
124+
expect(el.getAttribute('class')).toBe('cc')
125+
_.addClass(el, 'bb')
126+
expect(el.getAttribute('class')).toBe('cc bb')
127+
_.addClass(el, 'bb')
128+
expect(el.getAttribute('class')).toBe('cc bb')
129+
})
117130
})
118131
}

0 commit comments

Comments
 (0)