diff --git a/src/htmx.js b/src/htmx.js index 556247b2..2fb8b9c5 100644 --- a/src/htmx.js +++ b/src/htmx.js @@ -1010,8 +1010,8 @@ return (function () { } } - function maybeSelectFromResponse(elt, fragment) { - var selector = getClosestAttributeValue(elt, "hx-select"); + function maybeSelectFromResponse(elt, fragment, selectOverride) { + var selector = selectOverride || getClosestAttributeValue(elt, "hx-select"); if (selector) { var newFragment = getDocument().createDocumentFragment(); forEach(fragment.querySelectorAll(selector), function (node) { @@ -1085,12 +1085,12 @@ return (function () { } } - function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) { + function selectAndSwap(swapStyle, target, elt, responseText, settleInfo, selectOverride) { settleInfo.title = findTitle(responseText); var fragment = makeFragment(responseText); if (fragment) { handleOutOfBandSwaps(elt, fragment, settleInfo); - fragment = maybeSelectFromResponse(elt, fragment); + fragment = maybeSelectFromResponse(elt, fragment, selectOverride); handlePreservedElements(fragment); return swap(swapStyle, elt, target, fragment, settleInfo); } @@ -3325,8 +3325,13 @@ return (function () { // safari issue - see https://github.com/microsoft/playwright/issues/5894 } + var selectOverride; + if (hasHeader(xhr, /HX-Reselect:/i)) { + selectOverride = xhr.getResponseHeader("HX-Reselect"); + } + var settleInfo = makeSettleInfo(target); - selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo); + selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride); if (selectionInfo.elt && !bodyContains(selectionInfo.elt) && diff --git a/test/core/headers.js b/test/core/headers.js index e7d1ec25..3b72eb52 100644 --- a/test/core/headers.js +++ b/test/core/headers.js @@ -188,6 +188,16 @@ describe("Core htmx AJAX headers", function () { div1.innerHTML.should.equal("Result"); }) + it("should handle HX-Reselect", function () { + this.server.respondWith("GET", "/test", [200, {"HX-Reselect": "#d2"}, "