Beste Automatische Voerbakken voor Katten en Honden – Met App & Camera | Smartpaw – SmartPaw
Ga naar content
4 producten worden weergegeven
in theme.liquid
*/
(function () {
// ================== CONFIG ==================
var FORM_ID = 'TrJYBi'; // Je Klaviyo form ID
var MODE = 'from_checkout'; // 'cart_only' | 'from_checkout' | 'all'
var MIN_TIME_MS = 0; // min. tijd op pagina voordat we overwegen te tonen
var MIN_IDLE_MS = 0; // min. inactiviteit
var SCROLL_TRIGGER = 0; // 0 = direct bij eerste scroll-event
var SHOW_ONCE_PER_SESSION = true;
var REQUIRE_CART_ITEMS = true; // zet op false als je óók zonder items wil tonen
// ============================================
if (typeof window === 'undefined' || typeof document === 'undefined') return;
var path = location.pathname.toLowerCase();
var isCheckoutPath = path.includes('/checkout') || /\/checkouts?\//i.test(path);
if (isCheckoutPath) return; // toon niets IN checkout
var shownKey = 'kl_exit_popup_shown';
var cameFromCheckoutKey = 'came_from_checkout';
// --- Persistente "kwam uit checkout" detectie (per sessie) ---
(function markIfFromCheckoutReferrer() {
var ref = document.referrer || '';
if (/\/checkouts?\//i.test(ref) || /checkout\.shopify\.com/i.test(ref)) {
try { sessionStorage.setItem(cameFromCheckoutKey, '1'); } catch (e) {}
}
})();
if (SHOW_ONCE_PER_SESSION && sessionStorage.getItem(shownKey) === '1') return;
// MODE guards
var allowByMode = (function () {
if (MODE === 'cart_only') {
return path.includes('/cart');
}
if (MODE === 'from_checkout') {
// Toestaan als huidige referrer checkout is OF als we dat eerder al zagen in deze sessie
var ref = document.referrer || '';
var refIsCheckout = /\/checkouts?\//i.test(ref) || /checkout\.shopify\.com/i.test(ref);
var seenBefore = sessionStorage.getItem(cameFromCheckoutKey) === '1';
return refIsCheckout || seenBefore;
}
// 'all'
return true;
})();
if (!allowByMode) return;
var lastUserEventTs = Date.now();
var lastClickWasInternal = false;
var isTouch = window.matchMedia && matchMedia('(pointer:coarse)').matches;
function openForm() {
try {
window._klOnsite = window._klOnsite || [];
window._klOnsite.push(['openForm', FORM_ID]);
if (SHOW_ONCE_PER_SESSION) sessionStorage.setItem(shownKey, '1');
} catch (e) {}
}
function getCartCount() {
return fetch('/cart.js', { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.json() : { item_count: 0 }; })
.then(function (j) { return j.item_count || 0; })
.catch(function () { return 0; });
}
function readyToConsider() {
return performance.now() >= MIN_TIME_MS && (Date.now() - lastUserEventTs >= MIN_IDLE_MS);
}
function maybeOpen(source) {
if (SHOW_ONCE_PER_SESSION && sessionStorage.getItem(shownKey) === '1') return;
if (!readyToConsider()) return;
if (lastClickWasInternal) return; // waarschijnlijk normale interne navigatie
var proceed = function (count) {
if (!REQUIRE_CART_ITEMS || count > 0) openForm();
};
if (REQUIRE_CART_ITEMS) {
getCartCount().then(proceed);
} else {
proceed(0);
}
}
// Activity tracking (voor idle)
['touchstart','touchmove','scroll','keydown','mousemove','click'].forEach(function (evt) {
document.addEventListener(evt, function(){ lastUserEventTs = Date.now(); }, { passive: true });
});
// Interne link-klikken herkennen (om popup niet te tonen bij normale navigatie)
document.addEventListener('click', function (e) {
var a = e.target && e.target.closest ? e.target.closest('a[href]') : null;
if (!a) { lastClickWasInternal = false; return; }
try {
var url = new URL(a.href, location.origin);
lastClickWasInternal = (url.origin === location.origin);
} catch (_) { lastClickWasInternal = false; }
}, true);
// Desktop: exit-intent via bovenrand
function onMouseOut(e) {
if (e.clientY > 0) return; // alleen bovenkant verlaat
document.removeEventListener('mouseout', onMouseOut, true);
maybeOpen('desktop-exit');
}
// Mobiel: back-intentie via history state
function armMobileBackIntent() {
try {
if (!isTouch) return;
if (!(history.state && history.state.__fv_back)) {
history.pushState(Object.assign({}, history.state, { __fv_back: true }), '');
}
window.addEventListener('popstate', function () {
maybeOpen('mobile-back');
// geen history.go(-1): gebruiker beslist
}, { once: true });
} catch (e) {}
}
// Zachte signalen voor beide platformen
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'hidden') {
maybeOpen('visibility-hidden');
}
});
window.addEventListener('pagehide', function () {
maybeOpen('pagehide');
});
// Scroll-diepte (bij SCROLL_TRIGGER=0 triggert dit bij eerste scroll-event)
var scrollTriggered = false;
function onScrollDepth() {
if (scrollTriggered) return;
var doc = document.documentElement;
var scrollTop = window.pageYOffset || doc.scrollTop || 0;
var viewH = window.innerHeight || doc.clientHeight || 0;
var fullH = Math.max(
doc.scrollHeight, doc.offsetHeight,
document.body ? Math.max(document.body.scrollHeight, document.body.offsetHeight) : 0
);
if (fullH <= 0) return;
var depth = (scrollTop + viewH) / fullH;
if (depth >= SCROLL_TRIGGER) {
scrollTriggered = true;
window.removeEventListener('scroll', onScrollDepth);
maybeOpen('scroll-depth');
}
}
window.addEventListener('scroll', onScrollDepth, { passive: true });
// Armeren (meteen bij jou, want MIN_TIME_MS = 0)
setTimeout(function () {
document.addEventListener('mouseout', onMouseOut, true); // desktop
armMobileBackIntent(); // mobiel
}, MIN_TIME_MS);
// Prefetch cart (sneller bij REQUIRE_CART_ITEMS=true)
setTimeout(function(){ getCartCount(); }, 500);
})();