Skip to content

Commit db8e5e0

Browse files
scrhartleyscrhartley
andauthored
Fix event not being available in hx-vals/hx-vars when hx-trigger has delay (#3196)
Fix event not being available in hx-vals/hx-vars when hx-trigger uses delay Co-authored-by: scrhartley <scrhartley@github.com>
1 parent e01027b commit db8e5e0

2 files changed

Lines changed: 49 additions & 12 deletions

File tree

src/htmx.js

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3782,9 +3782,10 @@ var htmx = (function() {
37823782
* @param {string} attr
37833783
* @param {boolean=} evalAsDefault
37843784
* @param {Object=} values
3785+
* @param {Event=} event
37853786
* @returns {Object}
37863787
*/
3787-
function getValuesForElement(elt, attr, evalAsDefault, values) {
3788+
function getValuesForElement(elt, attr, evalAsDefault, values, event) {
37883789
if (values == null) {
37893790
values = {}
37903791
}
@@ -3810,7 +3811,13 @@ var htmx = (function() {
38103811
}
38113812
let varsValues
38123813
if (evaluateValue) {
3813-
varsValues = maybeEval(elt, function() { return Function('return (' + str + ')')() }, {})
3814+
varsValues = maybeEval(elt, function() {
3815+
if (event) {
3816+
return Function('event', 'return (' + str + ')')(event)
3817+
} else { // allow window.event to be accessible
3818+
return Function('return (' + str + ')')()
3819+
}
3820+
}, {})
38143821
} else {
38153822
varsValues = parseJSON(str)
38163823
}
@@ -3822,7 +3829,7 @@ var htmx = (function() {
38223829
}
38233830
}
38243831
}
3825-
return getValuesForElement(asElement(parentElt(elt)), attr, evalAsDefault, values)
3832+
return getValuesForElement(asElement(parentElt(elt)), attr, evalAsDefault, values, event)
38263833
}
38273834

38283835
/**
@@ -3842,28 +3849,31 @@ var htmx = (function() {
38423849

38433850
/**
38443851
* @param {Element} elt
3845-
* @param {*?} expressionVars
3852+
* @param {Event=} event
3853+
* @param {*?=} expressionVars
38463854
* @returns
38473855
*/
3848-
function getHXVarsForElement(elt, expressionVars) {
3849-
return getValuesForElement(elt, 'hx-vars', true, expressionVars)
3856+
function getHXVarsForElement(elt, event, expressionVars) {
3857+
return getValuesForElement(elt, 'hx-vars', true, expressionVars, event)
38503858
}
38513859

38523860
/**
38533861
* @param {Element} elt
3854-
* @param {*?} expressionVars
3862+
* @param {Event=} event
3863+
* @param {*?=} expressionVars
38553864
* @returns
38563865
*/
3857-
function getHXValsForElement(elt, expressionVars) {
3858-
return getValuesForElement(elt, 'hx-vals', false, expressionVars)
3866+
function getHXValsForElement(elt, event, expressionVars) {
3867+
return getValuesForElement(elt, 'hx-vals', false, expressionVars, event)
38593868
}
38603869

38613870
/**
38623871
* @param {Element} elt
3872+
* @param {Event=} event
38633873
* @returns {FormData}
38643874
*/
3865-
function getExpressionVars(elt) {
3866-
return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt))
3875+
function getExpressionVars(elt, event) {
3876+
return mergeObjects(getHXVarsForElement(elt, event), getHXValsForElement(elt, event))
38673877
}
38683878

38693879
/**
@@ -4302,7 +4312,7 @@ var htmx = (function() {
43024312
if (etc.values) {
43034313
overrideFormData(rawFormData, formDataFromObject(etc.values))
43044314
}
4305-
const expressionVars = formDataFromObject(getExpressionVars(elt))
4315+
const expressionVars = formDataFromObject(getExpressionVars(elt, event))
43064316
const allFormData = overrideFormData(rawFormData, expressionVars)
43074317
let filteredFormData = filterValues(allFormData, elt)
43084318

test/attributes/hx-vals.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,33 @@ describe('hx-vals attribute', function() {
314314
}
315315
calledEvent.should.equal(true)
316316
})
317+
318+
it('using js: with hx-vals has event available', function() {
319+
this.server.respondWith('POST', '/vars', function(xhr) {
320+
var params = getParameters(xhr)
321+
params.i1.should.equal('test')
322+
xhr.respond(200, {}, 'Clicked!')
323+
})
324+
var div = make('<div id="test" hx-post="/vars" hx-vals="js:i1:event.target.id"></div>')
325+
div.click()
326+
this.server.respond()
327+
div.innerHTML.should.equal('Clicked!')
328+
})
329+
330+
it('using js: with hx-vals has event available when used with a delay', function(done) {
331+
var params = null
332+
var div = make('<div id="test" hx-post="/vars" hx-vals="js:{i1:event.target.id}" hx-trigger="click delay:10ms"></div>')
333+
htmx.on(div, 'htmx:configRequest', function(evt) {
334+
evt.preventDefault()
335+
params = evt.detail.parameters
336+
}, { once: true })
337+
div.click()
338+
new Promise(resolve => setTimeout(resolve, 20)).then(function() {
339+
params.i1.should.equal('test')
340+
done()
341+
}).catch(done)
342+
})
343+
317344
it('hx-vals works with null values', function() {
318345
this.server.respondWith('POST', '/vars', function(xhr) {
319346
var params = getParameters(xhr)

0 commit comments

Comments
 (0)