Skip to content

Commit 79d6b57

Browse files
authored
Escape ID in Util.getSelectorFromElement (twbs#24700)
1 parent 26dc17b commit 79d6b57

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

js/src/util.js

+13
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ const Util = (($) => {
8787
}
8888
}
8989

90+
function escapeId(selector) {
91+
// we escape IDs in case of special selectors (selector = '#myId:something')
92+
// $.escapeSelector does not exist in jQuery < 3
93+
selector = typeof $.escapeSelector === 'function' ? $.escapeSelector(selector).substr(1) :
94+
selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1')
95+
96+
return selector
97+
}
9098

9199
/**
92100
* --------------------------------------------------------------------------
@@ -112,6 +120,11 @@ const Util = (($) => {
112120
selector = element.getAttribute('href') || ''
113121
}
114122

123+
// if it's an ID
124+
if (selector.charAt(0) === '#') {
125+
selector = escapeId(selector)
126+
}
127+
115128
try {
116129
const $selector = $(document).find(selector)
117130
return $selector.length > 0 ? selector : null

js/tests/unit/util.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,26 @@ $(function () {
44
QUnit.module('util')
55

66
QUnit.test('Util.getSelectorFromElement should return the correct element', function (assert) {
7-
assert.expect(2)
7+
assert.expect(5)
8+
89
var $el = $('<div data-target="body"></div>').appendTo($('#qunit-fixture'))
910
assert.strictEqual(Util.getSelectorFromElement($el[0]), 'body')
1011

1112
// not found element
1213
var $el2 = $('<div data-target="#fakeDiv"></div>').appendTo($('#qunit-fixture'))
1314
assert.strictEqual(Util.getSelectorFromElement($el2[0]), null)
15+
16+
// should escape ID and find the correct element
17+
var $el3 = $('<div data-target="#collapse:Example"></div>').appendTo($('#qunit-fixture'))
18+
$('<div id="collapse:Example"></div>').appendTo($('#qunit-fixture'))
19+
assert.strictEqual(Util.getSelectorFromElement($el3[0]), '#collapse\\:Example')
20+
21+
// if $.escapeSelector doesn't exist in older jQuery versions (< 3)
22+
var tmpEscapeSelector = $.escapeSelector
23+
delete $.escapeSelector
24+
assert.ok(typeof $.escapeSelector === 'undefined', '$.escapeSelector undefined')
25+
assert.strictEqual(Util.getSelectorFromElement($el3[0]), '#collapse\\:Example')
26+
$.escapeSelector = tmpEscapeSelector
1427
})
1528

1629
QUnit.test('Util.typeCheckConfig should thrown an error when a bad config is passed', function (assert) {

0 commit comments

Comments
 (0)