this.$watched = $watched.length ? $watched : this.$element.find('[data-equalizer-watch]');
this.$element.attr('data-resize', (eqId || Foundation.GetYoDigits(6, 'eq')));
+ this.$element.attr('data-mutate', (eqId || Foundation.GetYoDigits(6, 'eq')));
this.hasNested = this.$element.find('[data-equalizer]').length > 0;
this.isNested = this.$element.parentsUntil(document.body, '[data-equalizer]').length > 0;
this.$element.off({
'.zf.equalizer': this._bindHandler.onPostEqualizedBound,
'resizeme.zf.trigger': this._bindHandler.onResizeMeBound
+ 'mutateme.zf.trigger': this._bindHandler.onResizeMeBound
});
}
this.$element.on('postequalized.zf.equalizer', this._bindHandler.onPostEqualizedBound);
}else{
this.$element.on('resizeme.zf.trigger', this._bindHandler.onResizeMeBound);
+ this.$element.on('mutateme.zf.trigger', this._bindHandler.onResizeMeBound);
}
this.isOn = true;
}
eventsListener();
resizeListener();
scrollListener();
+ mutateListener();
closemeListener();
}
}
}
+function mutateListener(debounce) {
+ let timer,
+ $nodes = $('[data-mutate]');
+ if ($nodes.length) {
+ if (timer) {
+ clearTimeout(timer);
+ }
+
+ timer = setTimeout(function () {
+
+ //trigger all listening elements and signal a mutate event
+ $nodes.each(function () {
+ $(this).triggerHandler('mutateme.zf.trigger');
+ });
+
+ }, 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 ($target.attr("data-events")) {
-
- case "resize" :
- $target.triggerHandler('resizeme.zf.trigger', [$target]);
- break;
-
- case "scroll" :
- $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]);
- break;
-
- // case "mutate" :
- // console.log('mutate', $target);
- // $target.triggerHandler('mutate.zf.trigger');
- //
- // //make sure we don't get stuck in an infinite loop from sloppy codeing
- // if ($target.index('[data-mutate]') == $("[data-mutate]").length-1) {
- // domMutationObserver();
- // }
- // break;
-
- default :
- return false;
- //nothing
+ 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"] });
+ }
}
}
- if(nodes.length){
- //for each element that needs to listen for resizing, scrolling, (or coming soon mutation) add a single observer
- for (var i = 0; i <= nodes.length-1; i++) {
- let elementObserver = new MutationObserver(listeningElementsMutation);
- elementObserver.observe(nodes[i], { attributes: true, childList: false, characterData: false, subtree:false, attributeFilter:["data-events"]});
- }
- }
-}
-
// ------------------------------------
// [PH]