-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmutation.js
More file actions
135 lines (119 loc) · 3.38 KB
/
Copy pathmutation.js
File metadata and controls
135 lines (119 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/**
* mutation.js - Mutation observer and handler
*
* @version 2.4.1
* @package tpl_lyquix
* @author Lyquix
* @copyright Copyright (C) 2015 - 2018 Lyquix
* @license GNU General Public License version 2 or later
* @link https://github.com/Lyquix/tpl_lyquix
*/
if(lqx && !('mutation' in lqx)) {
lqx.mutation = (function(){
var opts = {
};
var vars = {
observer: null,
addNode: [],
removeNode: [],
modAttrib: []
};
var init = function(){
// Copy default opts and vars
jQuery.extend(true, lqx.opts.mutation, opts);
opts = lqx.opts.mutation;
jQuery.extend(true, lqx.vars.mutation, vars);
vars = lqx.vars.mutation;
// Initialize on lqxready
lqx.vars.window.on('lqxready', function() {
// Initialize only if enabled
if(opts.enabled) {
lqx.log('Initializing `mutation`');
// Create observer
observer();
}
});
// Run only once
lqx.mutation.init = function(){
lqx.warn('lqx.mutation.init already executed');
};
return true;
};
// create a custom mutation observer that will trigger any needed functions
var observer = function(){
// handle videos that may be loaded dynamically
var mo = window.MutationObserver || window.WebKitMutationObserver;
// check for mutationObserver support , if exists, user the mutation observer object, if not use the listener method.
if (typeof mo !== 'undefined'){
vars.observer = new mo(handler);
vars.observer.observe(document, {childList: true, subtree: true, attributes: true});
}
};
var addHandler = function(type, selector, callback) {
// type can be addNode, removeNode, and modAttrib
switch(type) {
case 'addNode':
vars.addNode.push({'selector': selector, 'callback': callback});
break;
case 'removeNode':
vars.removeNode.push({'selector': selector, 'callback': callback});
break;
case 'modAttrib':
vars.modAttrib.push({'selector': selector, 'callback': callback});
break;
}
lqx.log('Adding handler for mutation ' + type + ' for ' + selector);
};
// Mutation observer handler
var handler = function(mutRecs) {
if(!(mutRecs instanceof Array)) {
// Not an array, convert to an array
mutRecs = [mutRecs];
}
mutRecs.forEach(function(mutRec){
switch(mutRec.type) {
case 'childList':
// Handle nodes added
if (mutRec.addedNodes.length > 0) {
var nodes = nodesArray(mutRec.addedNodes)
nodes.forEach(function(e){
vars.addNode.forEach(function(h){
if(jQuery(e).is(h.selector)) h.callback(e);
});
});
}
// Handle nodes removed
if (mutRec.removedNodes.length > 0) {
var nodes = nodesArray(mutRec.removedNodes)
nodes.forEach(function(e){
vars.removeNode.forEach(function(h){
if(jQuery(e).is(h.selector)) h.callback(e);
});
});
}
break;
case 'attributes':
vars.modAttrib.forEach(function(h){
if(mutRec.target.matches(h.selector)) h.callback(mutRec.target);
});
break;
}
});
};
var nodesArray = function(nodes) {
var o = [];
for(var i = 0; i < nodes.length; i++) {
var n = jQuery(nodes[i]);
o.push(n);
var children = n.find('*').toArray();
if(children.length) o = o.concat(children);
}
return o;
}
return {
init: init,
addHandler: addHandler
};
})();
lqx.mutation.init();
}