Skip to content

Instantly share code, notes, and snippets.

@kyleknighted
Last active December 12, 2015 10:18
Show Gist options
  • Save kyleknighted/4757687 to your computer and use it in GitHub Desktop.
Save kyleknighted/4757687 to your computer and use it in GitHub Desktop.
an all platform mutation observer that has never been tested - so use at your own risk `attrWatcher.watch(objArray, callbackFunction);`
var attrWatcher = (function() {
"use strict";
var isDOMAttrModifiedSupported, MutationObserver, attrchange, observer, disconnect;
isDOMAttrModifiedSupported = function() {
var p = document.createElement('p');
var flag = false;
if (p.addEventListener) p.addEventListener('DOMAttrModified', function() { flag = true }, false);
else if (p.attachEvent) p.attachEvent('onDOMAttrModified', function() { flag = true });
else return false;
p.setAttribute('id', 'target');
return flag;
}
//initialize Mutation Observer
MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
attrchange = function(ele, callback) {
if (MutationObserver) { //Modern Browsers supporting MutationObserver
var options = {
subtree: false,
attributes: true,
attributeOldValue: true
};
observer = new MutationObserver(function(mutations) {
mutations.forEach(function(e) {
callback.call(e.target, e, e.attributeName);
});
});
for(var i=0; i<ele.length; i++) {
observer.observe(ele[i], options);
}
} else if (isDOMAttrModifiedSupported()) { //Opera but really bad memory performance
for(var i=0; i<ele.length; i++) {
ele[i].on('DOMAttrModified', function(e) {
callback.call(this, e, e.attrName);
});
}
} else if ('onpropertychange' in document.body) { // Fuck You IE
for(var i=0; i<ele.length; i++) {
ele[i].on('propertychange', function(e) {
callback.call(this, e, window.event.propertyName);
});
}
}
}
disconnect = function() {
if (MutationObserver) {
observer.disconnect();
}
}
return {
watch: attrchange,
disco: disconnect
}
})();
var attrWatcher=function(){"use strict";var e,t,n,r,i;e=function(){var e=document.createElement("p");var t=false;if(e.addEventListener)e.addEventListener("DOMAttrModified",function(){t=true},false);else if(e.attachEvent)e.attachEvent("onDOMAttrModified",function(){t=true});else return false;e.setAttribute("id","target");return t};t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;n=function(n,i){if(t){var s={subtree:false,attributes:true,attributeOldValue:true};r=new t(function(e){e.forEach(function(e){i.call(e.target,e,e.attributeName)})});for(var o=0;o<n.length;o++){r.observe(n[o],s)}}else if(e()){for(var o=0;o<n.length;o++){n[o].on("DOMAttrModified",function(e){i.call(this,e,e.attrName)})}}else if("onpropertychange"in document.body){for(var o=0;o<n.length;o++){n[o].on("propertychange",function(e){i.call(this,e,window.event.propertyName)})}}};i=function(){if(t){r.disconnect()}};return{watch:n,disco:i}}()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment