diff --git a/src/htmx.js b/src/htmx.js index 7c916561..be276703 100644 --- a/src/htmx.js +++ b/src/htmx.js @@ -619,22 +619,21 @@ return (function () { } } - function handleTrigger(elt, trigger) { - if (trigger) { - if (trigger.indexOf("{") === 0) { - var triggers = parseJSON(trigger); - for (var eventName in triggers) { - if (triggers.hasOwnProperty(eventName)) { - var detail = triggers[eventName]; - if (!isRawObject(detail)) { - detail = {"value": detail} - } - triggerEvent(elt, eventName, detail); + function handleTrigger(xhr, header, elt) { + var triggerBody = xhr.getResponseHeader(header); + if (triggerBody.indexOf("{") === 0) { + var triggers = parseJSON(triggerBody); + for (var eventName in triggers) { + if (triggers.hasOwnProperty(eventName)) { + var detail = triggers[eventName]; + if (!isRawObject(detail)) { + detail = {"value": detail} } + triggerEvent(elt, eventName, detail); } - } else { - triggerEvent(elt, trigger, []); } + } else { + triggerEvent(elt, triggerBody, []); } } @@ -1613,6 +1612,10 @@ return (function () { } } + function hasHeader(xhr, regexp) { + return xhr.getAllResponseHeaders().match(regexp); + } + function issueAjaxRequest(elt, verb, path, eventTarget) { var target = getTarget(elt); if (target == null) { @@ -1726,11 +1729,11 @@ return (function () { try { if (!triggerEvent(elt, 'htmx:beforeOnLoad', eventDetail)) return; - if (xhr.getAllResponseHeaders().search(/HX-Trigger/i) >= 0) { - handleTrigger(elt, this.getResponseHeader("HX-Trigger")); + if (hasHeader(xhr, /HX-Trigger:/i)) { + handleTrigger(xhr, "HX-Trigger", elt); } - if (xhr.getAllResponseHeaders().search(/HX-Push/i) >= 0) { + if (hasHeader(xhr,/HX-Push:/i)) { var pushedUrl = this.getResponseHeader("HX-Push"); } @@ -1792,6 +1795,11 @@ return (function () { if (anchor) { location.hash = anchor; } + + if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) { + handleTrigger(xhr, "HX-Trigger-After-Swap", elt); + } + var doSettle = function(){ forEach(settleInfo.tasks, function (task) { task.call(); @@ -1809,6 +1817,10 @@ return (function () { triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path:pathToPush}); } updateScrollState(target, settleInfo.elts, swapSpec); + + if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) { + handleTrigger(xhr, "HX-Trigger-After-Settle", elt); + } } if (swapSpec.settleDelay > 0) {