‘use strict’;
!function($) {
const MutationObserver = (function () {
var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; for (var i=0; i < prefixes.length; i++) { if (`${prefixes[i]}MutationObserver` in window) { return window[`${prefixes[i]}MutationObserver`]; } } return false;
}());
const triggers = (el, type) => {
el.data(type).split(' ').forEach(id => { $(`#${id}`)[ type === 'close' ? 'trigger' : 'triggerHandler'](`${type}.zf.trigger`, [el]); });
}; // Elements with [data-open] will reveal a plugin that supports it when clicked. $(document).on(‘click.zf.trigger’, ‘[data-open]’, function() {
triggers($(this), 'open');
});
// Elements with [data-close] will close a plugin that supports it when clicked. // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. $(document).on(‘click.zf.trigger’, ‘[data-close]’, function() {
let id = $(this).data('close'); if (id) { triggers($(this), 'close'); } else { $(this).trigger('close.zf.trigger'); }
});
// Elements with [data-toggle] will toggle a plugin that supports it when clicked. $(document).on(‘click.zf.trigger’, ‘[data-toggle]’, function() {
let id = $(this).data('toggle'); if (id) { triggers($(this), 'toggle'); } else { $(this).trigger('toggle.zf.trigger'); }
});
// Elements with [data-closable] will respond to close.zf.trigger events. $(document).on(‘close.zf.trigger’, ‘[data-closable]’, function(e){
e.stopPropagation(); let animation = $(this).data('closable'); if(animation !== ''){ Foundation.Motion.animateOut($(this), animation, function() { $(this).trigger('closed.zf'); }); }else{ $(this).fadeOut().trigger('closed.zf'); }
});
$(document).on(‘focus.zf.trigger blur.zf.trigger’, ‘[data-toggle-focus]’, function() {
let id = $(this).data('toggle-focus'); $(`#${id}`).triggerHandler('toggle.zf.trigger', [$(this)]);
});
/**
-
Fires once after all other scripts have loaded
-
@function
-
@private
*/ $(window).on(‘load’, () => {
checkListeners();
});
function checkListeners() {
eventsListener(); resizeListener(); scrollListener(); closemeListener();
}
//******** only fires this function once on load, if there’s something to watch ******** function closemeListener(pluginName) {
var yetiBoxes = $('[data-yeti-box]'), plugNames = ['dropdown', 'tooltip', 'reveal']; if(pluginName){ if(typeof pluginName === 'string'){ plugNames.push(pluginName); }else if(typeof pluginName === 'object' && typeof pluginName[0] === 'string'){ plugNames.concat(pluginName); }else{ console.error('Plugin names must be strings'); } } if(yetiBoxes.length){ let listeners = plugNames.map((name) => { return `closeme.zf.${name}`; }).join(' '); $(window).off(listeners).on(listeners, function(e, pluginId){ let plugin = e.namespace.split('.')[0]; let plugins = $(`[data-${plugin}]`).not(`[data-yeti-box="${pluginId}"]`); plugins.each(function(){ let _this = $(this); _this.triggerHandler('close.zf.trigger', [_this]); }); }); }
}
function resizeListener(debounce){
let timer, $nodes = $('[data-resize]'); if($nodes.length){ $(window).off('resize.zf.trigger') .on('resize.zf.trigger', function(e) { if (timer) { clearTimeout(timer); } timer = setTimeout(function(){ if(!MutationObserver){//fallback for IE 9 $nodes.each(function(){ $(this).triggerHandler('resizeme.zf.trigger'); }); } //trigger all listening elements and signal a resize event $nodes.attr('data-events', "resize"); }, debounce || 10);//default time to emit resize event }); }
}
function scrollListener(debounce){
let timer, $nodes = $('[data-scroll]'); if($nodes.length){ $(window).off('scroll.zf.trigger') .on('scroll.zf.trigger', function(e){ if(timer){ clearTimeout(timer); } timer = setTimeout(function(){ if(!MutationObserver){//fallback for IE 9 $nodes.each(function(){ $(this).triggerHandler('scrollme.zf.trigger'); }); } //trigger all listening elements and signal a scroll event $nodes.attr('data-events', "scroll"); }, debounce || 10);//default time to emit scroll event }); }
}
function eventsListener() {
if(!MutationObserver){ return false; } let nodes = document.querySelectorAll('[data-resize], [data-scroll], [data-mutate]'); //element callback var listeningElementsMutation = function (mutationRecordsList) { var $target = $(mutationRecordsList[0].target); //trigger the event handler for the element depending on type switch (mutationRecordsList[0].type) { case "attributes": if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") { $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]); } if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") { $target.triggerHandler('resizeme.zf.trigger', [$target]); } if (mutationRecordsList[0].attributeName === "style") { $target.closest("[data-mutate]").attr("data-events","mutate"); $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); } break; case "childList": $target.closest("[data-mutate]").attr("data-events","mutate"); $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); break; default: return false; //nothing } }; if (nodes.length) { //for each element that needs to listen for resizing, scrolling, or mutation add a single observer for (var i = 0; i <= nodes.length - 1; i++) { var elementObserver = new MutationObserver(listeningElementsMutation); elementObserver.observe(nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] }); } } }
// ————————————
// [PH] // Foundation.CheckWatchers = checkWatchers; Foundation.IHearYou = checkListeners; // Foundation.ISeeYou = scrollListener; // Foundation.IFeelYou = closemeListener;
}(jQuery);