diff --git a/src/htmx.js b/src/htmx.js index c707f062..8da583ac 100644 --- a/src/htmx.js +++ b/src/htmx.js @@ -878,6 +878,9 @@ return (function () { } else if (token === "throttle" && tokens[0] === ":") { tokens.shift(); triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); + } else if ((token === "root" || token === "threshold") && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); } else { triggerErrorEvent(elt, "htmx:syntax:error", {token:tokens.shift()}); } @@ -1324,6 +1327,25 @@ return (function () { } else if (triggerSpec.trigger === "revealed") { initScrollHandler(); maybeReveal(elt); + } else if (triggerSpec.trigger === "intersect") { + var observerOptions = {}; + if (triggerSpec.root) { + observerOptions.root = querySelectorExt(triggerSpec.root) + } + if (triggerSpec.threshold) { + observerOptions.threshold = parseFloat(triggerSpec.threshold); + } + var observer = new IntersectionObserver(function (entries) { + for (var i = 0; i < entries.length; i++) { + var entry = entries[i]; + if (entry.isIntersecting) { + triggerEvent(elt, "intersect"); + break; + } + } + }, observerOptions); + observer.observe(elt); + addEventListener(elt, verb, path, nodeData, triggerSpec); } else if (triggerSpec.trigger === "load") { loadImmediately(elt, verb, path, nodeData, triggerSpec.delay); } else if (triggerSpec.pollInterval) { diff --git a/test/manual/intersect-test-eventHandler.html b/test/manual/intersect-test-eventHandler.html new file mode 100644 index 00000000..de99eb2d --- /dev/null +++ b/test/manual/intersect-test-eventHandler.html @@ -0,0 +1,154 @@ + + + + Test Scroll Event Handler + + + + + + + + + + +

Scrolling Event Handler Tests

+

You should be able to scroll this page at any speed and see HTML fragments loaded into the DIVs "remotely" without any hiccups.

+ +
+
+
+
+
+
+
+
+
+ +

Threshold .5

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Threshold 1

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Regular

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +