Skip to content

Commit 2e816de

Browse files
committed
fix vuejs#612 v-html treating # as id selector
1 parent 0a769b9 commit 2e816de

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

src/directives/html.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ module.exports = {
2828
_.remove(this.nodes[i])
2929
}
3030
// convert new value to a fragment
31-
var frag = templateParser.parse(value, true)
31+
// do not attempt to retrieve from id selector
32+
var frag = templateParser.parse(value, true, true)
3233
// save a reference to these nodes so we can remove later
3334
this.nodes = _.toArray(frag.childNodes)
3435
_.before(frag, this.el)

src/parsers/template.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var _ = require('../util')
22
var Cache = require('../cache')
3-
var templateCache = new Cache(100)
3+
var templateCache = new Cache(1000)
4+
var idSelectorCache = new Cache(1000)
45

56
var map = {
67
_default : [0, '', ''],
@@ -204,10 +205,11 @@ exports.clone = function (node) {
204205
* - id selector: '#some-template-id'
205206
* - template string: '<div><span>{{msg}}</span></div>'
206207
* @param {Boolean} clone
208+
* @param {Boolean} noSelector
207209
* @return {DocumentFragment|undefined}
208210
*/
209211

210-
exports.parse = function (template, clone) {
212+
exports.parse = function (template, clone, noSelector) {
211213
var node, frag
212214

213215
// if the template is already a document fragment,
@@ -220,15 +222,15 @@ exports.parse = function (template, clone) {
220222

221223
if (typeof template === 'string') {
222224
// id selector
223-
if (template.charAt(0) === '#') {
225+
if (!noSelector && template.charAt(0) === '#') {
224226
// id selector can be cached too
225-
frag = templateCache.get(template)
227+
frag = idSelectorCache.get(template)
226228
if (!frag) {
227229
node = document.getElementById(template.slice(1))
228230
if (node) {
229231
frag = nodeToFragment(node)
230232
// save selector to cache
231-
templateCache.put(template, frag)
233+
idSelectorCache.put(template, frag)
232234
}
233235
}
234236
} else {

test/unit/specs/parsers/template_spec.js

+6
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ if (_.inBrowser) {
117117
document.head.removeChild(node)
118118
})
119119

120+
it('should be able to not use id selectors', function () {
121+
var res = parse('#hi', false, true)
122+
expect(res instanceof DocumentFragment).toBeTruthy()
123+
expect(res.firstChild.nodeValue).toBe('#hi')
124+
})
125+
120126
it('should deal with Safari template clone bug', function () {
121127
var a = document.createElement('div')
122128
a.innerHTML = '<template>1</template>'

0 commit comments

Comments
 (0)