Skip to content

Commit 31dd615

Browse files
committed
Wrapped selector syntax
1 parent 9a9d7be commit 31dd615

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

src/htmx.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,7 +1134,29 @@ var htmx = (function() {
11341134

11351135
elt = resolveTarget(elt)
11361136

1137-
const parts = selector.split(',')
1137+
const parts = []
1138+
{
1139+
let chevronsCount = 0
1140+
let part = ''
1141+
for (let i = 0; i < selector.length; i++) {
1142+
const char = selector[i]
1143+
if (char === '<') {
1144+
chevronsCount++
1145+
} else if (selector.substring(i, i + 2) === '/>') {
1146+
chevronsCount--
1147+
i++
1148+
} else if (char === ',' && chevronsCount === 0) {
1149+
parts.push(part)
1150+
part = ''
1151+
} else {
1152+
part += char
1153+
}
1154+
}
1155+
if (part.length > 0) {
1156+
parts.push(part)
1157+
}
1158+
}
1159+
11381160
const result = []
11391161
const unprocessedParts = []
11401162
while (parts.length > 0) {

test/attributes/hx-include.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,4 +292,48 @@ describe('hx-include attribute', function() {
292292
this.server.respond()
293293
btn.innerHTML.should.equal('Clicked!')
294294
})
295+
296+
it('hx-include processes wrapped next/previous selectors correctly', function() {
297+
this.server.respondWith('POST', '/include', function(xhr) {
298+
var params = getParameters(xhr)
299+
should.equal(params.i1, undefined)
300+
params.i2.should.equal('foo')
301+
params.i3.should.equal('bar')
302+
should.equal(params.i4, undefined)
303+
should.equal(params.i5, undefined)
304+
xhr.respond(200, {}, 'Clicked!')
305+
})
306+
make('<input name="i4" value="test2" id="i4"/>' +
307+
'<div id="i">' +
308+
'<input name="i1" value="test" id="i1"/>' +
309+
'<input name="i2" value="foo"/>' +
310+
'<button id="btn" hx-post="/include" hx-include="next <#nonexistent, input/>, previous <#i5, [name=\'i2\'], #i4/>"></button>' +
311+
'</div>' +
312+
'<input name="i3" value="bar"/>' +
313+
'<input name="i5" value="test"/>')
314+
var btn = byId('btn')
315+
btn.click()
316+
this.server.respond()
317+
btn.innerHTML.should.equal('Clicked!')
318+
})
319+
320+
it('hx-include processes wrapped closest selector correctly', function() {
321+
this.server.respondWith('POST', '/include', function(xhr) {
322+
var params = getParameters(xhr)
323+
should.equal(params.i1, undefined)
324+
params.i2.should.equal('bar')
325+
xhr.respond(200, {}, 'Clicked!')
326+
})
327+
make('<section>' +
328+
'<input name="i1" value="foo"/>' +
329+
'<div>' +
330+
'<input name="i2" value="bar"/>' +
331+
'<button id="btn" hx-post="/include" hx-include="closest <section, div/>"></button>' +
332+
'</div>' +
333+
'</section>')
334+
var btn = byId('btn')
335+
btn.click()
336+
this.server.respond()
337+
btn.innerHTML.should.equal('Clicked!')
338+
})
295339
})

0 commit comments

Comments
 (0)