Skip to content

Commit 5f27148

Browse files
committed
Merge pull request vuejs#537 from tyage/svg-class
Support v-class attr of svg in IE
2 parents fa791a8 + 4e31c35 commit 5f27148

File tree

2 files changed

+25
-21
lines changed

2 files changed

+25
-21
lines changed

src/transition.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var endEvents = sniffEndEvents(),
22
config = require('./config'),
3+
utils = require('./utils'),
34
// batch enter animations so we only force the layout once
45
Batcher = require('./batcher'),
56
batcher = new Batcher(),
@@ -79,10 +80,7 @@ function applyTransitionClass (el, stage, changeState, hasAnimation) {
7980
return codes.CSS_SKIP
8081
}
8182

82-
// if the browser supports transition,
83-
// it must have classList...
8483
var onEnd,
85-
classList = el.classList,
8684
existingCallback = el.vue_trans_cb,
8785
enterClass = config.enterClass,
8886
leaveClass = config.leaveClass,
@@ -91,30 +89,30 @@ function applyTransitionClass (el, stage, changeState, hasAnimation) {
9189
// cancel unfinished callbacks and jobs
9290
if (existingCallback) {
9391
el.removeEventListener(endEvent, existingCallback)
94-
classList.remove(enterClass)
95-
classList.remove(leaveClass)
92+
utils.removeClass(el, enterClass)
93+
utils.removeClass(el, leaveClass)
9694
el.vue_trans_cb = null
9795
}
9896

9997
if (stage > 0) { // enter
10098

10199
// set to enter state before appending
102-
classList.add(enterClass)
100+
utils.addClass(el, enterClass)
103101
// append
104102
changeState()
105103
// trigger transition
106104
if (!hasAnimation) {
107105
batcher.push({
108106
execute: function () {
109-
classList.remove(enterClass)
107+
utils.removeClass(el, enterClass)
110108
}
111109
})
112110
} else {
113111
onEnd = function (e) {
114112
if (e.target === el) {
115113
el.removeEventListener(endEvent, onEnd)
116114
el.vue_trans_cb = null
117-
classList.remove(enterClass)
115+
utils.removeClass(el, enterClass)
118116
}
119117
}
120118
el.addEventListener(endEvent, onEnd)
@@ -128,7 +126,7 @@ function applyTransitionClass (el, stage, changeState, hasAnimation) {
128126
// trigger hide transition
129127
batcher.push({
130128
execute: function () {
131-
classList.add(leaveClass)
129+
utils.addClass(el, leaveClass)
132130
}
133131
})
134132
onEnd = function (e) {
@@ -137,7 +135,7 @@ function applyTransitionClass (el, stage, changeState, hasAnimation) {
137135
el.vue_trans_cb = null
138136
// actually remove node here
139137
changeState()
140-
classList.remove(leaveClass)
138+
utils.removeClass(el, leaveClass)
141139
}
142140
}
143141
// attach transition end listener
@@ -148,7 +146,7 @@ function applyTransitionClass (el, stage, changeState, hasAnimation) {
148146
changeState()
149147
}
150148
return codes.CSS_L
151-
149+
152150
}
153151

154152
}

src/utils.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ var config = require('./config'),
77
THIS_RE = /[^\w]this[^\w]/,
88
BRACKET_RE_S = /\['([^']+)'\]/g,
99
BRACKET_RE_D = /\["([^"]+)"\]/g,
10-
hasClassList = 'classList' in document.documentElement,
1110
ViewModel // late def
1211

1312
var defer =
@@ -257,36 +256,43 @@ var utils = module.exports = {
257256
},
258257

259258
/**
260-
* add class for IE9
259+
* add class for IE
261260
* uses classList if available
262261
*/
263262
addClass: function (el, cls) {
264-
if (hasClassList) {
263+
if (el.classList) {
265264
el.classList.add(cls)
266265
} else {
267-
var cur = ' ' + el.className + ' '
266+
var cur = ' ' + utils.getClassName(el) + ' '
268267
if (cur.indexOf(' ' + cls + ' ') < 0) {
269-
el.className = (cur + cls).trim()
268+
el.setAttribute('class', (cur + cls).trim())
270269
}
271270
}
272271
},
273272

274273
/**
275-
* remove class for IE9
274+
* remove class for IE
276275
*/
277276
removeClass: function (el, cls) {
278-
if (hasClassList) {
277+
if (el.classList) {
279278
el.classList.remove(cls)
280279
} else {
281-
var cur = ' ' + el.className + ' ',
280+
var cur = ' ' + utils.getClassName(el) + ' ',
282281
tar = ' ' + cls + ' '
283282
while (cur.indexOf(tar) >= 0) {
284283
cur = cur.replace(tar, ' ')
285284
}
286-
el.className = cur.trim()
285+
el.setAttribute('class', cur.trim())
287286
}
288287
},
289288

289+
/**
290+
* get class name for IE
291+
*/
292+
getClassName: function(el) {
293+
return (el.className instanceof SVGAnimatedString ? el.className.baseVal : el.className)
294+
},
295+
290296
/**
291297
* Convert an object to Array
292298
* used in v-repeat and array filters
@@ -328,4 +334,4 @@ function enableDebug () {
328334
}
329335
}
330336
}
331-
}
337+
}

0 commit comments

Comments
 (0)