123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- ;(function ($) {
- "use strict";
- var combinators = [' ', '>', '+', '~'];
- var fraternisers = ['+', '~'];
- var complexTypes = ['ATTR', 'PSEUDO', 'ID', 'CLASS'];
-
- if (!Element.prototype.matches) {
- Element.prototype.matches = Element.prototype.matchesSelector ||
- Element.prototype.webkitMatchesSelector ||
- Element.prototype.mozMatchesSelector ||
- Element.prototype.msMatchesSelector;
- }
-
- function grok(msobserver) {
- if (!$.find.tokenize) {
-
-
-
-
- msobserver.isCombinatorial = true;
- msobserver.isFraternal = true;
- msobserver.isComplex = true;
- return;
- }
-
- msobserver.isCombinatorial = false;
- msobserver.isFraternal = false;
- msobserver.isComplex = false;
- var token = $.find.tokenize(msobserver.selector);
- for (var i = 0; i < token.length; i++) {
- for (var j = 0; j < token[i].length; j++) {
- if (combinators.indexOf(token[i][j].type) != -1)
- msobserver.isCombinatorial = true;
- if (fraternisers.indexOf(token[i][j].type) != -1)
- msobserver.isFraternal = true;
- if (complexTypes.indexOf(token[i][j].type) != -1)
- msobserver.isComplex = true;
- }
- }
- }
-
- var MutationSelectorObserver = function (selector, callback, options) {
- this.selector = selector.trim();
- this.callback = callback;
- this.options = options;
- grok(this);
- };
-
- var msobservers = [];
- msobservers.initialize = function (selector, callback, options) {
-
-
- var seen = [];
- var callbackOnce = function () {
- if (seen.indexOf(this) == -1) {
- seen.push(this);
- $(this).each(callback);
- }
- };
-
- $(options.target).find(selector).each(callbackOnce);
-
- var msobserver = new MutationSelectorObserver(selector, callbackOnce, options)
- this.push(msobserver);
-
- var observer = new MutationObserver(function (mutations) {
- var matches = [];
-
- for (var m = 0; m < mutations.length; m++) {
-
- if (mutations[m].type == 'attributes') {
-
- if (mutations[m].target.matches(msobserver.selector))
- matches.push(mutations[m].target);
-
- if (msobserver.isFraternal)
- matches.push.apply(matches, mutations[m].target.parentElement.querySelectorAll(msobserver.selector));
- else
- matches.push.apply(matches, mutations[m].target.querySelectorAll(msobserver.selector));
- }
-
- if (mutations[m].type == 'childList') {
-
- for (var n = 0; n < mutations[m].addedNodes.length; n++) {
- if (!(mutations[m].addedNodes[n] instanceof Element)) continue;
-
- if (mutations[m].addedNodes[n].matches(msobserver.selector))
- matches.push(mutations[m].addedNodes[n]);
-
- if (msobserver.isFraternal)
- matches.push.apply(matches, mutations[m].addedNodes[n].parentElement.querySelectorAll(msobserver.selector));
- else
- matches.push.apply(matches, mutations[m].addedNodes[n].querySelectorAll(msobserver.selector));
- }
- }
- }
-
- for (var i = 0; i < matches.length; i++) {
- $(matches[i]).each(msobserver.callback);
- }
- });
-
- var defaultObeserverOpts = { childList: true, subtree: true, attributes: msobserver.isComplex };
- observer.observe(options.target, options.observer || defaultObeserverOpts );
- return observer;
- };
-
- $.fn.initialize = function (callback, options) {
- return msobservers.initialize(this.selector, callback, $.extend({}, $.initialize.defaults, options));
- };
-
- $.initialize = function (selector, callback, options) {
- return msobservers.initialize(selector, callback, $.extend({}, $.initialize.defaults, options));
- };
-
- $.initialize.defaults = {
- target: document.documentElement,
- observer: null
- }
- })(jQuery);
|