diff --git a/dist/htmx.js b/dist/htmx.js
index 50f2ab42..e4c290d0 100644
--- a/dist/htmx.js
+++ b/dist/htmx.js
@@ -161,6 +161,8 @@ return (function () {
case "td":
case "th":
return parseHTML("
", 3);
+ case "script":
+ return parseHTML("" + resp + "
", 1);
default:
return parseHTML(resp, 0);
}
@@ -610,7 +612,19 @@ return (function () {
}
}
+ var TITLE_FINDER = /([\s\S]+?)<\/title>/im;
+ function findTitle(content) {
+ var result = TITLE_FINDER.exec(content);
+ if (result) {
+ return result[1];
+ }
+ }
+
function selectAndSwap(swapStyle, target, elt, responseText, settleInfo) {
+ var title = findTitle(responseText);
+ if(title) {
+ window.document.title = title;
+ }
var fragment = makeFragment(responseText);
if (fragment) {
handleOutOfBandSwaps(fragment, settleInfo);
@@ -686,7 +700,7 @@ return (function () {
if (tokens[0] === '[') {
tokens.shift();
var bracketCount = 1;
- var conditionalSource = "(function(" + paramName + "){ return (";
+ var conditionalSource = " return (function(" + paramName + "){ return (";
var last = null;
while (tokens.length > 0) {
var token = tokens[0];
@@ -699,7 +713,7 @@ return (function () {
tokens.shift();
conditionalSource += ")})";
try {
- var conditionFunction = eval(conditionalSource);
+ var conditionFunction = Function(conditionalSource)();
conditionFunction.source = conditionalSource;
return conditionFunction;
} catch (e) {
@@ -993,9 +1007,11 @@ return (function () {
elt.addEventListener(getTriggerSpecs(elt)[0].trigger, function (evt) {
var headers = getHeaders(elt, webSocketSourceElt, null, elt);
var results = getInputValues(elt, 'post');
- var rawParameters = results.values;
var errors = results.errors;
- var filteredParameters = filterValues(rawParameters, elt);
+ var rawParameters = results.values;
+ var expressionVars = getHXVarsForElement(elt);
+ var allParameters = mergeObjects(rawParameters, expressionVars);
+ var filteredParameters = filterValues(allParameters, elt);
filteredParameters['HEADERS'] = headers;
if (errors && errors.length > 0) {
triggerEvent(elt, 'htmx:validation:halted', errors);
@@ -1165,9 +1181,14 @@ return (function () {
});
}
+ function isBoosted() {
+ return document.querySelector("[hx-boost], [data-hx-boost]");
+ }
+
function findElementsToProcess(elt) {
if (elt.querySelectorAll) {
- var results = elt.querySelectorAll(VERB_SELECTOR + ", a, form, [hx-sse], [data-hx-sse], [hx-ws]," +
+ var boostedElts = isBoosted() ? ", a, form" : "";
+ var results = elt.querySelectorAll(VERB_SELECTOR + boostedElts + ", [hx-sse], [data-hx-sse], [hx-ws]," +
" [data-hx-ws]");
return results;
} else {
@@ -1698,22 +1719,41 @@ return (function () {
}
}
- function addExpressionVars(elt, rawParameters) {
- if (elt == null) {
- return;
+ function getValuesForElement(elt, attr, strToValues, expressionVars) {
+ if (expressionVars == null) {
+ expressionVars = {};
}
- var attributeValue = getAttributeValue(elt, "hx-vars");
+ if (elt == null) {
+ return expressionVars;
+ }
+ var attributeValue = getAttributeValue(elt, attr);
if (attributeValue) {
- var varsValues = eval("({" + attributeValue + "})");
+ var str = attributeValue.trim();
+ if (str.indexOf('{') !== 0) {
+ str = "{" + str + "}";
+ }
+ var varsValues = strToValues(str);
for (var key in varsValues) {
if (varsValues.hasOwnProperty(key)) {
- if (rawParameters[key] == null) {
- rawParameters[key] = varsValues[key];
+ if (expressionVars[key] == null) {
+ expressionVars[key] = varsValues[key];
}
}
}
}
- addExpressionVars(parentElt(elt), rawParameters);
+ return getValuesForElement(parentElt(elt), attr, strToValues, expressionVars);
+ }
+
+ function getHXVarsForElement(elt, expressionVars) {
+ return getValuesForElement(elt, "hx-vars", function(valueStr){
+ return Function("return (" + valueStr + ")")()
+ }, expressionVars);
+ }
+
+ function getHXValsForElement(elt, expressionVars) {
+ return getValuesForElement(elt, "hx-vars", function(valueStr){
+ return JSON.parse(expressionVars);
+ }, expressionVars);
}
function safelySetHeaderValue(xhr, header, headerValue) {
@@ -1745,6 +1785,10 @@ return (function () {
}
function issueAjaxRequest(elt, verb, path, eventTarget, triggeringEvent) {
+ if (!bodyContains(elt)) {
+ console.log("Body does not contain", elt);
+ return; // do not issue requests for elements removed from the DOM
+ }
var target = getTarget(elt);
if (target == null) {
triggerErrorEvent(elt, 'htmx:targetError', {target: getAttributeValue(elt, "hx-target")});
@@ -1783,10 +1827,11 @@ return (function () {
var headers = getHeaders(elt, target, promptResponse, eventTarget);
var results = getInputValues(elt, verb);
- var rawParameters = results.values;
var errors = results.errors;
- addExpressionVars(elt, rawParameters);
- var filteredParameters = filterValues(rawParameters, elt);
+ var rawParameters = results.values;
+ var expressionVars = getHXVarsForElement(elt);
+ var allParameters = mergeObjects(rawParameters, expressionVars);
+ var filteredParameters = filterValues(allParameters, elt);
if (verb !== 'get' && getClosestAttributeValue(elt, "hx-encoding") == null) {
headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
@@ -1799,7 +1844,7 @@ return (function () {
var requestConfig = {
parameters: filteredParameters,
- unfilteredParameters:rawParameters,
+ unfilteredParameters: allParameters,
headers:headers,
target:target,
verb:verb,
@@ -1863,7 +1908,19 @@ return (function () {
}
if (hasHeader(xhr,/HX-Push:/i)) {
- var pushedUrl = this.getResponseHeader("HX-Push");
+ var pushedUrl = xhr.getResponseHeader("HX-Push");
+ }
+
+ if (hasHeader(xhr, /HX-Redirect:/i)) {
+ window.location.href = xhr.getResponseHeader("HX-Redirect");
+ return;
+ }
+
+ if (hasHeader(xhr,/HX-Refresh:/i)) {
+ if ("true" === xhr.getResponseHeader("HX-Refresh")) {
+ location.reload();
+ return;
+ }
}
var shouldSaveHistory = shouldPush(elt) || pushedUrl;
@@ -1876,9 +1933,9 @@ return (function () {
if (this.status !== 204) {
if (!triggerEvent(target, 'htmx:beforeSwap', eventDetail)) return;
- var resp = this.response;
+ var serverResponse = this.response;
withExtensions(elt, function(extension){
- resp = extension.transformResponse(resp, xhr, elt);
+ serverResponse = extension.transformResponse(serverResponse, xhr, elt);
});
// Save current page
@@ -1900,7 +1957,7 @@ return (function () {
};
var settleInfo = makeSettleInfo(target);
- selectAndSwap(swapSpec.swapStyle, target, elt, resp, settleInfo);
+ selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo);
if (selectionInfo.elt &&
!bodyContains(selectionInfo.elt) &&
diff --git a/dist/htmx.min.js b/dist/htmx.min.js
index cedac8ee..2f532960 100644
--- a/dist/htmx.min.js
+++ b/dist/htmx.min.js
@@ -1 +1 @@
-(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else{e.htmx=t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var L={onLoad:x,process:We,on:F,off:P,trigger:Ke,find:w,findAll:S,closest:I,remove:E,addClass:C,removeClass:A,toggleClass:M,takeClass:D,defineExtension:Dt,removeExtension:It,logAll:b,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",attributesToSettle:["class","style","width","height"]},parseInterval:f,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){return new WebSocket(e,[])}};var t=["get","post","put","delete","patch"];var r=t.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function f(e){if(e==null||e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function l(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function T(e,t){return l(e,t)||l(e,"data-"+t)}function a(e){return e.parentElement}function O(){return document}function c(e,t){if(t(e)){return e}else if(a(e)){return c(a(e),t)}else{return null}}function q(e,t){var r=null;c(e,function(e){return r=T(e,t)});return r}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function n(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=O().createDocumentFragment()}return i}function u(e){var t=n(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i("",1);case"col":return i("",2);case"tr":return i("",2);case"td":case"th":return i("",3);default:return i(e,0)}}function s(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function v(e){return s(e,"Function")}function d(e){return s(e,"Object")}function R(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function g(e){var t=[];if(e){for(var r=0;r=0}function H(e){return O().body.contains(e)}function p(e){return e.trim().split(/\s+/)}function k(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){Ye(e);return null}}function e(e){return eval(e)}function x(t){var e=L.on("htmx:load",function(e){t(e.detail.elt)});return e}function b(){L.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function w(e,t){if(t){return e.querySelector(t)}else{return O().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return O().body.querySelectorAll(e)}}function E(e,t){if(t){setTimeout(function(){E(e)},t)}else{e.parentElement.removeChild(e)}}function C(e,t,r){if(r){setTimeout(function(){C(e,t)},r)}else{e.classList.add(t)}}function A(e,t,r){if(r){setTimeout(function(){A(e,t)},r)}else{e.classList.remove(t)}}function M(e,t){e.classList.toggle(t)}function D(e,t){N(e.parentElement.children,function(e){A(e,t)});C(e,t)}function I(e,t){do{if(e==null||h(e,t))return e}while(e=e&&a(e))}function X(e,t,r){if(v(t)){return{target:O().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function F(t,r,n){Ft(function(){var e=X(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=v(r);return e?r:n}function P(t,r,n){Ft(function(){var e=X(t,r,n);e.target.removeEventListener(e.event,e.listener)});return v(r)?r:n}function U(e){var t=c(e,function(e){return T(e,"hx-target")!==null});if(t){var r=T(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return I(e,r.substr(8))}else if(r.indexOf("find ")===0){return w(e,r.substr(5))}else{return O().querySelector(r)}}else{var n=R(e);if(n.boosted){return O().body}else{return e}}}function z(e){var t=L.config.attributesToSettle;for(var r=0;r0){var t=n.querySelector(e.tagName+"[id='"+e.id+"']");if(t&&t!==n){var r=e.cloneNode();V(e,t);i.tasks.push(function(){V(e,r)})}}})}function $(e){return function(){We(e);Ve(e);J(e);Ke(e,"htmx:load")}}function J(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function Z(e,t,r,n){B(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push($(i))}}}function G(e){var t=R(e);if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(e.children){N(e.children,function(e){G(e)})}}function Y(e,t,r){if(e.tagName==="BODY"){return re(e,t)}else{var n=e.previousSibling;Z(a(e),e,t,r);if(n==null){var i=a(e).firstChild}else{var i=n.nextSibling}R(e).replacedWith=i;while(i&&i!==e){if(i.nodeType===Node.ELEMENT_NODE){r.elts.push(i)}i=i.nextElementSibling}G(e);a(e).removeChild(e)}}function K(e,t,r){return Z(e,e.firstChild,t,r)}function Q(e,t,r){return Z(a(e),e,t,r)}function ee(e,t,r){return Z(e,null,t,r)}function te(e,t,r){return Z(a(e),e.nextSibling,t,r)}function re(e,t,r){var n=e.firstChild;Z(e,n,t,r);if(n){while(n.nextSibling){G(n.nextSibling);e.removeChild(n.nextSibling)}G(n);e.removeChild(n)}}function ne(e,t){var r=q(e,"hx-select");if(r){var n=O().createDocumentFragment();N(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ie(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Y(r,n,i);return;case"afterbegin":K(r,n,i);return;case"beforebegin":Q(r,n,i);return;case"beforeend":ee(r,n,i);return;case"afterend":te(r,n,i);return;default:var a=Xt(t);for(var o=0;o0){var a=e[0];if(a==="]"){r--;if(r===0){if(i===null){n=n+"true"}e.shift();n+=")})";try{var o=eval(n);o.source=n;return o}catch(e){Je(O().body,"htmx:syntax:error",{error:e,source:n});return null}}}else if(a==="["){r++}if(ve(a,i,t)){n+="(("+t+"."+a+") ? ("+t+"."+a+") : (window."+a+"))"}else{n=n+a}i=e.shift()}}}function ge(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}function me(e){var t=T(e,"hx-trigger");var r=[];if(t){var n=he(t);do{ge(n,ce);var i=n.length;var a=ge(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};ge(n,ce);o.pollInterval=f(ge(n,se));r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var s={trigger:a};var l=de(n,"event");if(l){s.eventFilter=l}while(n.length>0&&n[0]!==","){ge(n,ce);var u=n.shift();if(u==="changed"){s.changed=true}else if(u==="once"){s.once=true}else if(u==="delay"&&n[0]===":"){n.shift();s.delay=f(ge(n,se))}else if(u==="throttle"&&n[0]===":"){n.shift();s.throttle=f(ge(n,se))}else{Je(e,"htmx:syntax:error",{token:n.shift()})}}r.push(s)}}if(n.length===i){Je(e,"htmx:syntax:error",{token:n.shift()})}ge(n,ce)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,"input, textarea, select")){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function pe(e){R(e).cancelled=true}function ye(e,t,r,n){var i=R(e);i.timeout=setTimeout(function(){if(H(e)&&i.cancelled!==true){Ht(e,t,r);ye(e,t,T(e,"hx-"+t),n)}},n)}function xe(e){return location.hostname===e.hostname&&l(e,"href")&&l(e,"href").indexOf("#")!==0}function be(t,r,e){if(t.tagName==="A"&&xe(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=l(t,"href")}else{var a=l(t,"method");n=a?a.toLowerCase():"get";i=l(t,"action")}e.forEach(function(e){Ce(t,n,i,r,e,true)})}}function we(e){return e.tagName==="FORM"||h(e,'input[type="submit"], button')&&I(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function Se(e,t){return R(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function Ee(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){Je(O().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function Ce(n,i,a,e,o,s){var t=function(e){if(Ee(o,e)){return}if(Se(n,e)){return}if(s||we(n)){e.preventDefault()}var t=R(e);var r=R(n);if(!t.handled){t.handled=true;if(o.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(o.changed){if(r.lastValue===n.value){return}else{r.lastValue=n.value}}if(r.delayed){clearTimeout(r.delayed)}if(r.throttle){return}if(o.throttle){r.throttle=setTimeout(function(){Ht(n,i,a,e.target,e);r.throttle=null},o.throttle)}else if(o.delay){r.delayed=setTimeout(function(){Ht(n,i,a,e.target,e)},o.delay)}else{Ht(n,i,a,e.target,e)}}};e.trigger=o.trigger;e.eventListener=t;n.addEventListener(o.trigger,t)}var Ae=false;var Le=null;function Te(){if(!Le){Le=function(){Ae=true};window.addEventListener("scroll",Le);setInterval(function(){if(Ae){Ae=false;N(O().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){Oe(e)})}},200)}}function Oe(e){var t=R(e);if(!t.revealed&&m(e)){t.revealed=true;Ht(e,t.verb,t.path)}}function qe(e,t,r){var n=p(r);for(var i=0;i0){Ke(o,"htmx:validation:halted",i);return}l.send(JSON.stringify(a));if(we(o)){e.preventDefault()}})}else{Je(o,"htmx:noWebSocketSourceError")}}function ke(e,t,r){var n=p(r);for(var i=0;iL.config.historyCacheSize){i.shift()}try{localStorage.setItem("htmx-history-cache",JSON.stringify(i))}catch(e){Je(O().body,"htmx:historyCacheError",{cause:e})}}function rt(e){var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){Ke(O().body,"htmx:historyCacheMissLoad",i);var e=u(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=et();var r=Lt(t);re(t,e,r);ot(r.tasks);Qe=n}else{Je(O().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function lt(e){it(Qe);e=e||location.pathname+location.search;Ke(O().body,"htmx:historyRestore",{path:e});var t=rt(e);if(t){var r=u(t.content);var n=et();var i=Lt(n);re(n,r,i);ot(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);Qe=e}else{st(e)}}function ut(e){var t=q(e,"hx-push-url");return t&&t!=="false"||e.tagName==="A"&&R(e).boosted}function ft(e){var t=q(e,"hx-push-url");return t==="true"||t==="false"?null:t}function ct(e){vt(e,"add")}function ht(e){vt(e,"remove")}function vt(e,t){var r=q(e,"hx-indicator");if(r){var n=O().querySelectorAll(r)}else{n=[e]}N(n,function(e){e.classList[t].call(e.classList,L.config.requestClass)})}function dt(e,t){for(var r=0;r0){r["swapStyle"]=n[0];for(var i=1;i0){Ke(u,"htmx:validation:halted",p);return i()}var y=f.split("#");var x=y[0];var b=y[1];if(e==="get"){var w=x;var S=Object.keys(m).length!==0;if(S){if(w.indexOf("?")<0){w+="?"}else{w+="&"}w+=bt(m);if(b){w+="#"+b}}h.open("GET",w,true)}else{h.open(e.toUpperCase(),f,true)}h.overrideMimeType("text/html");for(var E in l){if(l.hasOwnProperty(E)){var C=l[E];qt(h,E,C)}}var A={xhr:h,target:c,requestConfig:p};h.onload=function(){try{if(!Ke(u,"htmx:beforeOnLoad",A))return;if(Nt(h,/HX-Trigger:/i)){oe(h,"HX-Trigger",u)}if(Nt(h,/HX-Push:/i)){var a=this.getResponseHeader("HX-Push")}var o=ut(u)||a;if(this.status>=200&&this.status<400){if(this.status===286){pe(u)}if(this.status!==204){if(!Ke(c,"htmx:beforeSwap",A))return;var s=this.response;Ge(u,function(e){s=e.transformResponse(s,h,u)});if(o){it()}var l=Ct(u);c.classList.add(L.config.swappingClass);var e=function(){try{var e=document.activeElement;var t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null};var r=Lt(c);ae(l.swapStyle,c,u,s,r);if(t.elt&&!H(t.elt)&&t.elt.id){var n=document.getElementById(t.elt.id);if(n){if(t.start&&n.setSelectionRange){n.setSelectionRange(t.start,t.end)}n.focus()}}c.classList.remove(L.config.swappingClass);N(r.elts,function(e){if(e.classList){e.classList.add(L.config.settlingClass)}Ke(e,"htmx:afterSwap",A)});if(b){location.hash=b}if(Nt(h,/HX-Trigger-After-Swap:/i)){oe(h,"HX-Trigger-After-Swap",u)}var i=function(){N(r.tasks,function(e){e.call()});N(r.elts,function(e){if(e.classList){e.classList.remove(L.config.settlingClass)}Ke(e,"htmx:afterSettle",A)});if(o){var e=a||ft(u)||Rt(h)||w||f;at(e);Ke(O().body,"htmx:pushedIntoHistory",{path:e})}Tt(c,r.elts,l);if(Nt(h,/HX-Trigger-After-Settle:/i)){oe(h,"HX-Trigger-After-Settle",u)}};if(l.settleDelay>0){setTimeout(i,l.settleDelay)}else{i()}}catch(e){Je(u,"htmx:swapError",A);throw e}};if(l.swapDelay>0){setTimeout(e,l.swapDelay)}else{e()}}}else{Je(u,"htmx:responseError",k({error:"Response Status Error Code "+this.status+" from "+f},A))}}catch(e){Je(u,"htmx:onLoadError",k({error:e},A));throw e}finally{ht(u);var t=R(u).replacedWith||u;Ke(t,"htmx:afterRequest",A);Ke(t,"htmx:afterOnLoad",A);i()}};h.onerror=function(){ht(u);Je(u,"htmx:afterRequest",A);Je(u,"htmx:sendError",A);i()};if(!Ke(u,"htmx:beforeRequest",A))return i();ct(u);N(["loadstart","loadend","progress","abort"],function(t){h.addEventListener(t,function(e){Ke(u,"htmx:xhr:"+t,k({},e.detail))})});h.send(e==="get"?null:At(h,u,m))}var kt={};function Mt(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Dt(e,t){kt[e]=k(Mt(),t)}function It(e){delete kt[e]}function Xt(e,r){if(e==null){return r}if(r==null){r=[]}var t=T(e,"hx-ext");if(t){N(t.split(","),function(e){e=e.replace(/ /g,"");var t=kt[e];if(t&&r.indexOf(t)<0){r.push(t)}})}return Xt(a(e),r)}function Ft(e){if(O().readyState!=="loading"){e()}else{O().addEventListener("DOMContentLoaded",e)}}function Pt(){if(L.config.includeIndicatorStyles!==false){O().head.insertAdjacentHTML("beforeend","")}}function Ut(){var e=O().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function zt(){var e=Ut();if(e){L.config=k(L.config,e)}}Ft(function(){zt();Pt();var e=O().body;We(e);Ke(e,"htmx:load",{});window.onpopstate=function(e){if(e.state&&e.state.htmx){lt()}}});return L}()});
\ No newline at end of file
+(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else{e.htmx=t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var O={onLoad:x,process:$e,on:F,off:P,trigger:tt,find:w,findAll:S,closest:I,remove:E,addClass:C,removeClass:A,toggleClass:L,takeClass:T,defineExtension:Ut,removeExtension:zt,logAll:b,logger:null,config:{historyEnabled:true,historyCacheSize:10,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:100,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",attributesToSettle:["class","style","width","height"]},parseInterval:f,_:e,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){return new WebSocket(e,[])}};var t=["get","post","put","delete","patch"];var n=t.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");function f(e){if(e==null||e==="null"||e==="false"||e===""){return null}else if(e.lastIndexOf("ms")===e.length-2){return parseFloat(e.substr(0,e.length-2))}else if(e.lastIndexOf("s")===e.length-1){return parseFloat(e.substr(0,e.length-1))*1e3}else{return parseFloat(e)}}function u(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function R(e,t){return u(e,t)||u(e,"data-"+t)}function l(e){return e.parentElement}function q(){return document}function c(e,t){if(t(e)){return e}else if(l(e)){return c(l(e),t)}else{return null}}function H(e,t){var r=null;c(e,function(e){return r=R(e,t)});return r}function v(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function r(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function i(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=q().createDocumentFragment()}return i}function h(e){var t=r(e);switch(t){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return i("",1);case"col":return i("",2);case"tr":return i("",2);case"td":case"th":return i("",3);case"script":return i(""+e+"
",1);default:return i(e,0)}}function a(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function s(e){return a(e,"Function")}function d(e){return a(e,"Object")}function N(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function g(e){var t=[];if(e){for(var r=0;r=0}function M(e){return q().body.contains(e)}function p(e){return e.trim().split(/\s+/)}function D(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function y(e){try{return JSON.parse(e)}catch(e){et(e);return null}}function e(e){return eval(e)}function x(t){var e=O.on("htmx:load",function(e){t(e.detail.elt)});return e}function b(){O.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function w(e,t){if(t){return e.querySelector(t)}else{return q().body.querySelector(e)}}function S(e,t){if(t){return e.querySelectorAll(t)}else{return q().body.querySelectorAll(e)}}function E(e,t){if(t){setTimeout(function(){E(e)},t)}else{e.parentElement.removeChild(e)}}function C(e,t,r){if(r){setTimeout(function(){C(e,t)},r)}else{e.classList.add(t)}}function A(e,t,r){if(r){setTimeout(function(){A(e,t)},r)}else{e.classList.remove(t)}}function L(e,t){e.classList.toggle(t)}function T(e,t){k(e.parentElement.children,function(e){A(e,t)});C(e,t)}function I(e,t){do{if(e==null||v(e,t))return e}while(e=e&&l(e))}function X(e,t,r){if(s(t)){return{target:q().body,event:e,listener:t}}else{return{target:e,event:t,listener:r}}}function F(t,r,n){_t(function(){var e=X(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=s(r);return e?r:n}function P(t,r,n){_t(function(){var e=X(t,r,n);e.target.removeEventListener(e.event,e.listener)});return s(r)?r:n}function U(e){var t=c(e,function(e){return R(e,"hx-target")!==null});if(t){var r=R(t,"hx-target");if(r==="this"){return t}else if(r.indexOf("closest ")===0){return I(e,r.substr(8))}else if(r.indexOf("find ")===0){return w(e,r.substr(5))}else{return q().querySelector(r)}}else{var n=N(e);if(n.boosted){return q().body}else{return e}}}function z(e){var t=O.config.attributesToSettle;for(var r=0;r0){var t=n.querySelector(e.tagName+"[id='"+e.id+"']");if(t&&t!==n){var r=e.cloneNode();V(e,t);i.tasks.push(function(){V(e,r)})}}})}function J(e){return function(){$e(e);je(e);$(e);tt(e,"htmx:load")}}function $(e){var t="[autofocus]";var r=v(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function Z(e,t,r,n){W(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(J(i))}}}function G(e){var t=N(e);if(t.webSocket){t.webSocket.close()}if(t.sseEventSource){t.sseEventSource.close()}if(e.children){k(e.children,function(e){G(e)})}}function Y(e,t,r){if(e.tagName==="BODY"){return re(e,t)}else{var n=e.previousSibling;Z(l(e),e,t,r);if(n==null){var i=l(e).firstChild}else{var i=n.nextSibling}N(e).replacedWith=i;while(i&&i!==e){if(i.nodeType===Node.ELEMENT_NODE){r.elts.push(i)}i=i.nextElementSibling}G(e);l(e).removeChild(e)}}function K(e,t,r){return Z(e,e.firstChild,t,r)}function Q(e,t,r){return Z(l(e),e,t,r)}function ee(e,t,r){return Z(e,null,t,r)}function te(e,t,r){return Z(l(e),e.nextSibling,t,r)}function re(e,t,r){var n=e.firstChild;Z(e,n,t,r);if(n){while(n.nextSibling){G(n.nextSibling);e.removeChild(n.nextSibling)}G(n);e.removeChild(n)}}function ne(e,t){var r=H(e,"hx-select");if(r){var n=q().createDocumentFragment();k(t.querySelectorAll(r),function(e){n.appendChild(e)});t=n}return t}function ie(e,t,r,n,i){switch(e){case"none":return;case"outerHTML":Y(r,n,i);return;case"afterbegin":K(r,n,i);return;case"beforebegin":Q(r,n,i);return;case"beforeend":ee(r,n,i);return;case"afterend":te(r,n,i);return;default:var a=Vt(t);for(var o=0;o([\s\S]+?)<\/title>/im;function oe(e){var t=ae.exec(e);if(t){return t[1]}}function se(e,t,r,n,i){var a=oe(n);if(a){window.document.title=a}var o=h(n);if(o){B(o,i);o=ne(r,o);return ie(e,r,t,o,i)}}function ue(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=y(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!d(o)){o={value:o}}tt(r,a,o)}}}else{tt(r,n,[])}}var le=/\s/;var fe=/[_$a-zA-Z]/;var ce=/[_$a-zA-Z0-9]/;var ve=['"',"'","/"];var he=/[^\s]/;function de(e){var t=[];var r=0;while(r0){var a=e[0];if(a==="]"){r--;if(r===0){if(i===null){n=n+"true"}e.shift();n+=")})";try{var o=Function(n)();o.source=n;return o}catch(e){Ye(q().body,"htmx:syntax:error",{error:e,source:n});return null}}}else if(a==="["){r++}if(ge(a,i,t)){n+="(("+t+"."+a+") ? ("+t+"."+a+") : (window."+a+"))"}else{n=n+a}i=e.shift()}}}function pe(e,t){var r="";while(e.length>0&&!e[0].match(t)){r+=e.shift()}return r}function ye(e){var t=R(e,"hx-trigger");var r=[];if(t){var n=de(t);do{pe(n,he);var i=n.length;var a=pe(n,/[,\[\s]/);if(a!==""){if(a==="every"){var o={trigger:"every"};pe(n,he);o.pollInterval=f(pe(n,le));r.push(o)}else if(a.indexOf("sse:")===0){r.push({trigger:"sse",sseEvent:a.substr(4)})}else{var s={trigger:a};var u=me(n,"event");if(u){s.eventFilter=u}while(n.length>0&&n[0]!==","){pe(n,he);var l=n.shift();if(l==="changed"){s.changed=true}else if(l==="once"){s.once=true}else if(l==="delay"&&n[0]===":"){n.shift();s.delay=f(pe(n,le))}else if(l==="throttle"&&n[0]===":"){n.shift();s.throttle=f(pe(n,le))}else{Ye(e,"htmx:syntax:error",{token:n.shift()})}}r.push(s)}}if(n.length===i){Ye(e,"htmx:syntax:error",{token:n.shift()})}pe(n,he)}while(n[0]===","&&n.shift())}if(r.length>0){return r}else if(v(e,"form")){return[{trigger:"submit"}]}else if(v(e,"input, textarea, select")){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function xe(e){N(e).cancelled=true}function be(e,t,r,n){var i=N(e);i.timeout=setTimeout(function(){if(M(e)&&i.cancelled!==true){Xt(e,t,r);be(e,t,R(e,"hx-"+t),n)}},n)}function we(e){return location.hostname===e.hostname&&u(e,"href")&&u(e,"href").indexOf("#")!==0}function Se(t,r,e){if(t.tagName==="A"&&we(t)||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=u(t,"href")}else{var a=u(t,"method");n=a?a.toLowerCase():"get";i=u(t,"action")}e.forEach(function(e){Le(t,n,i,r,e,true)})}}function Ee(e){return e.tagName==="FORM"||v(e,'input[type="submit"], button')&&I(e,"form")!==null||e.tagName==="A"&&e.href&&e.href.indexOf("#")!==0}function Ce(e,t){return N(e).boosted&&e.tagName==="A"&&t.type==="click"&&t.ctrlKey}function Ae(e,t){var r=e.eventFilter;if(r){try{return r(t)!==true}catch(e){Ye(q().body,"htmx:eventFilter:error",{error:e,source:r.source});return true}}return false}function Le(n,i,a,e,o,s){var t=function(e){if(Ae(o,e)){return}if(Ce(n,e)){return}if(s||Ee(n)){e.preventDefault()}var t=N(e);var r=N(n);if(!t.handled){t.handled=true;if(o.once){if(r.triggeredOnce){return}else{r.triggeredOnce=true}}if(o.changed){if(r.lastValue===n.value){return}else{r.lastValue=n.value}}if(r.delayed){clearTimeout(r.delayed)}if(r.throttle){return}if(o.throttle){r.throttle=setTimeout(function(){Xt(n,i,a,e.target,e);r.throttle=null},o.throttle)}else if(o.delay){r.delayed=setTimeout(function(){Xt(n,i,a,e.target,e)},o.delay)}else{Xt(n,i,a,e.target,e)}}};e.trigger=o.trigger;e.eventListener=t;n.addEventListener(o.trigger,t)}var Te=false;var Oe=null;function Re(){if(!Oe){Oe=function(){Te=true};window.addEventListener("scroll",Oe);setInterval(function(){if(Te){Te=false;k(q().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){qe(e)})}},200)}}function qe(e){var t=N(e);if(!t.revealed&&m(e)){t.revealed=true;Xt(e,t.verb,t.path)}}function He(e,t,r){var n=p(r);for(var i=0;i0){tt(u,"htmx:validation:halted",n);return}f.send(JSON.stringify(s));if(Ee(u)){e.preventDefault()}})}else{Ye(u,"htmx:noWebSocketSourceError")}}function De(e,t,r){var n=p(r);for(var i=0;iO.config.historyCacheSize){i.shift()}try{localStorage.setItem("htmx-history-cache",JSON.stringify(i))}catch(e){Ye(q().body,"htmx:historyCacheError",{cause:e})}}function at(e){var t=y(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){tt(q().body,"htmx:historyCacheMissLoad",i);var e=h(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=nt();var r=Rt(t);re(t,e,r);lt(r.tasks);rt=n}else{Ye(q().body,"htmx:historyCacheMissLoadError",i)}};e.send()}function ct(e){st(rt);e=e||location.pathname+location.search;tt(q().body,"htmx:historyRestore",{path:e});var t=at(e);if(t){var r=h(t.content);var n=nt();var i=Rt(n);re(n,r,i);lt(i.tasks);document.title=t.title;window.scrollTo(0,t.scroll);rt=e}else{ft(e)}}function vt(e){var t=H(e,"hx-push-url");return t&&t!=="false"||e.tagName==="A"&&N(e).boosted}function ht(e){var t=H(e,"hx-push-url");return t==="true"||t==="false"?null:t}function dt(e){mt(e,"add")}function gt(e){mt(e,"remove")}function mt(e,t){var r=H(e,"hx-indicator");if(r){var n=q().querySelectorAll(r)}else{n=[e]}k(n,function(e){e.classList[t].call(e.classList,O.config.requestClass)})}function pt(e,t){for(var r=0;r0){r["swapStyle"]=n[0];for(var i=1;i0){tt(l,"htmx:validation:halted",x);return i()}var b=f.split("#");var w=b[0];var S=b[1];if(e==="get"){var E=w;var C=Object.keys(y).length!==0;if(C){if(E.indexOf("?")<0){E+="?"}else{E+="&"}E+=Et(y);if(S){E+="#"+S}}v.open("GET",E,true)}else{v.open(e.toUpperCase(),f,true)}v.overrideMimeType("text/html");for(var A in u){if(u.hasOwnProperty(A)){var L=u[A];Mt(v,A,L)}}var T={xhr:v,target:c,requestConfig:x};v.onload=function(){try{if(!tt(l,"htmx:beforeOnLoad",T))return;if(It(v,/HX-Trigger:/i)){ue(v,"HX-Trigger",l)}if(It(v,/HX-Push:/i)){var a=v.getResponseHeader("HX-Push")}if(It(v,/HX-Redirect:/i)){window.location.href=v.getResponseHeader("HX-Redirect");return}if(It(v,/HX-Refresh:/i)){if("true"===v.getResponseHeader("HX-Refresh")){location.reload();return}}var o=vt(l)||a;if(this.status>=200&&this.status<400){if(this.status===286){xe(l)}if(this.status!==204){if(!tt(c,"htmx:beforeSwap",T))return;var s=this.response;Qe(l,function(e){s=e.transformResponse(s,v,l)});if(o){st()}var u=Tt(l);c.classList.add(O.config.swappingClass);var e=function(){try{var e=document.activeElement;var t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null};var r=Rt(c);se(u.swapStyle,c,l,s,r);if(t.elt&&!M(t.elt)&&t.elt.id){var n=document.getElementById(t.elt.id);if(n){if(t.start&&n.setSelectionRange){n.setSelectionRange(t.start,t.end)}n.focus()}}c.classList.remove(O.config.swappingClass);k(r.elts,function(e){if(e.classList){e.classList.add(O.config.settlingClass)}tt(e,"htmx:afterSwap",T)});if(S){location.hash=S}if(It(v,/HX-Trigger-After-Swap:/i)){ue(v,"HX-Trigger-After-Swap",l)}var i=function(){k(r.tasks,function(e){e.call()});k(r.elts,function(e){if(e.classList){e.classList.remove(O.config.settlingClass)}tt(e,"htmx:afterSettle",T)});if(o){var e=a||ht(l)||Dt(v)||E||f;ut(e);tt(q().body,"htmx:pushedIntoHistory",{path:e})}qt(c,r.elts,u);if(It(v,/HX-Trigger-After-Settle:/i)){ue(v,"HX-Trigger-After-Settle",l)}};if(u.settleDelay>0){setTimeout(i,u.settleDelay)}else{i()}}catch(e){Ye(l,"htmx:swapError",T);throw e}};if(u.swapDelay>0){setTimeout(e,u.swapDelay)}else{e()}}}else{Ye(l,"htmx:responseError",D({error:"Response Status Error Code "+this.status+" from "+f},T))}}catch(e){Ye(l,"htmx:onLoadError",D({error:e},T));throw e}finally{gt(l);var t=N(l).replacedWith||l;tt(t,"htmx:afterRequest",T);tt(t,"htmx:afterOnLoad",T);i()}};v.onerror=function(){gt(l);Ye(l,"htmx:afterRequest",T);Ye(l,"htmx:sendError",T);i()};if(!tt(l,"htmx:beforeRequest",T))return i();dt(l);k(["loadstart","loadend","progress","abort"],function(t){v.addEventListener(t,function(e){tt(l,"htmx:xhr:"+t,D({},e.detail))})});v.send(e==="get"?null:Ot(v,l,y))}var Ft={};function Pt(){return{onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ut(e,t){Ft[e]=D(Pt(),t)}function zt(e){delete Ft[e]}function Vt(e,r){if(e==null){return r}if(r==null){r=[]}var t=R(e,"hx-ext");if(t){k(t.split(","),function(e){e=e.replace(/ /g,"");var t=Ft[e];if(t&&r.indexOf(t)<0){r.push(t)}})}return Vt(l(e),r)}function _t(e){if(q().readyState!=="loading"){e()}else{q().addEventListener("DOMContentLoaded",e)}}function jt(){if(O.config.includeIndicatorStyles!==false){q().head.insertAdjacentHTML("beforeend","")}}function Bt(){var e=q().querySelector('meta[name="htmx-config"]');if(e){return y(e.content)}else{return null}}function Wt(){var e=Bt();if(e){O.config=D(O.config,e)}}_t(function(){Wt();jt();var e=q().body;$e(e);tt(e,"htmx:load",{});window.onpopstate=function(e){if(e.state&&e.state.htmx){ct()}}});return O}()});
\ No newline at end of file
diff --git a/dist/htmx.min.js.gz b/dist/htmx.min.js.gz
index 76b62087..3b498f13 100644
Binary files a/dist/htmx.min.js.gz and b/dist/htmx.min.js.gz differ
diff --git a/src/htmx.js b/src/htmx.js
index 1e2d6f67..a337a907 100644
--- a/src/htmx.js
+++ b/src/htmx.js
@@ -700,7 +700,7 @@ return (function () {
if (tokens[0] === '[') {
tokens.shift();
var bracketCount = 1;
- var conditionalSource = "(function(" + paramName + "){ return (";
+ var conditionalSource = " return (function(" + paramName + "){ return (";
var last = null;
while (tokens.length > 0) {
var token = tokens[0];
@@ -713,7 +713,7 @@ return (function () {
tokens.shift();
conditionalSource += ")})";
try {
- var conditionFunction = eval(conditionalSource);
+ var conditionFunction = Function(conditionalSource)();
conditionFunction.source = conditionalSource;
return conditionFunction;
} catch (e) {
@@ -1719,13 +1719,20 @@ return (function () {
}
}
- function getExpressionVars(elt, expressionVars = []) {
+ function getValuesForElement(elt, attr, strToValues, expressionVars) {
+ if (expressionVars == null) {
+ expressionVars = {};
+ }
if (elt == null) {
return expressionVars;
}
- var attributeValue = getAttributeValue(elt, "hx-vars");
+ var attributeValue = getAttributeValue(elt, attr);
if (attributeValue) {
- var varsValues = eval("({" + attributeValue + "})");
+ var str = attributeValue.trim();
+ if (str.indexOf('{') !== 0) {
+ str = "{" + str + "}";
+ }
+ var varsValues = strToValues(str);
for (var key in varsValues) {
if (varsValues.hasOwnProperty(key)) {
if (expressionVars[key] == null) {
@@ -1734,7 +1741,23 @@ return (function () {
}
}
}
- return getExpressionVars(parentElt(elt), expressionVars);
+ return getValuesForElement(parentElt(elt), attr, strToValues, expressionVars);
+ }
+
+ function getHXVarsForElement(elt, expressionVars) {
+ return getValuesForElement(elt, "hx-vars", function(valueStr){
+ return Function("return (" + valueStr + ")")()
+ }, expressionVars);
+ }
+
+ function getHXValsForElement(elt, expressionVars) {
+ return getValuesForElement(elt, "hx-vals", function(valueStr){
+ return JSON.parse(valueStr);
+ }, expressionVars);
+ }
+
+ function getExpressionVars(elt) {
+ return mergeObjects(getHXVarsForElement(elt), getHXValsForElement(elt));
}
function safelySetHeaderValue(xhr, header, headerValue) {
diff --git a/test/attributes/hx-vals.js b/test/attributes/hx-vals.js
new file mode 100644
index 00000000..1cdc1482
--- /dev/null
+++ b/test/attributes/hx-vals.js
@@ -0,0 +1,87 @@
+describe("hx-vals attribute", function() {
+ beforeEach(function () {
+ this.server = makeServer();
+ clearWorkArea();
+ });
+ afterEach(function () {
+ this.server.restore();
+ clearWorkArea();
+ });
+
+ it('basic hx-vals works', function () {
+ this.server.respondWith("POST", "/vars", function (xhr) {
+ var params = getParameters(xhr);
+ params['i1'].should.equal("test");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ var div = make("")
+ div.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+ it('multiple hx-vals works', function () {
+ this.server.respondWith("POST", "/vars", function (xhr) {
+ var params = getParameters(xhr);
+ params['v1'].should.equal("test");
+ params['v2'].should.equal("42");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ var div = make("")
+ div.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+ it('hx-vals can be on parents', function () {
+ this.server.respondWith("POST", "/vars", function (xhr) {
+ var params = getParameters(xhr);
+ params['i1'].should.equal("test");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ make("");
+ var div = byId("d1");
+ div.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+ it('hx-vals can override parents', function () {
+ this.server.respondWith("POST", "/vars", function (xhr) {
+ var params = getParameters(xhr);
+ params['i1'].should.equal("best");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ make("");
+ var div = byId("d1");
+ div.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+ it('hx-vals overrides inputs', function () {
+ this.server.respondWith("POST", "/include", function (xhr) {
+ var params = getParameters(xhr);
+ params['i1'].should.equal("best");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ var div = make("")
+ var input = byId("i1")
+ input.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+ it('hx-vals overrides hx-vars', function () {
+ this.server.respondWith("POST", "/vars", function (xhr) {
+ var params = getParameters(xhr);
+ params['i1'].should.equal("test");
+ xhr.respond(200, {}, "Clicked!")
+ });
+ var div = make("")
+ div.click();
+ this.server.respond();
+ div.innerHTML.should.equal("Clicked!");
+ });
+
+});
\ No newline at end of file
diff --git a/test/attributes/hx-vars.js b/test/attributes/hx-vars.js
index 37c4de2b..dbb6b609 100644
--- a/test/attributes/hx-vars.js
+++ b/test/attributes/hx-vars.js
@@ -59,7 +59,7 @@ describe("hx-vars attribute", function() {
div.innerHTML.should.equal("Clicked!");
});
- it('hx-vars override inputs', function () {
+ it('hx-vars overrides inputs', function () {
this.server.respondWith("POST", "/include", function (xhr) {
var params = getParameters(xhr);
params['i1'].should.equal("best");
diff --git a/test/index.html b/test/index.html
index 053eff8a..9aa54739 100644
--- a/test/index.html
+++ b/test/index.html
@@ -97,6 +97,7 @@
+