add intersect event for intersection observer

supports the `root` and `threshold` config variables
This commit is contained in:
carson 2021-05-18 13:19:03 -06:00
parent 4dd5004851
commit f6efc4a8c3
2 changed files with 176 additions and 0 deletions

View File

@ -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) {

View File

@ -0,0 +1,154 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Test Scroll Event Handler</title>
<script src="../../node_modules/sinon/pkg/sinon.js"></script>
<script src="../util/util.js"></script>
<script src="../../src/htmx.js"></script>
<script>
server = makeServer();
server.autoRespond = true;
server.respondWith("GET", "/more_content", "Here is more content for this page, loaded 'remotely'.");
</script>
<style>
.panel {
height:200px;
background-color:#eee;
margin-bottom:20px;
padding:20px;
}
</style>
</head>
<body style="padding:20px;font-family: sans-serif">
<h1>Scrolling Event Handler Tests</h1>
<p>You should be able to scroll this page at any speed and see HTML fragments loaded into the DIVs "remotely" without any hiccups.</p>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<h1>Threshold .5</h1>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:.5"></div>
<h1>Threshold 1</h1>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect threshold:1"></div>
<h1>Regular</h1>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
<div class="panel" hx-get="/more_content" hx-trigger="intersect"></div>
</body>
</html>