Skip to content

Commit 7a42d1c

Browse files
committed
Implement options.scanDocument.
Support scanning of only addedNodes in the mutation instead of scanning the entire document for matching selectors.
1 parent c968d4c commit 7a42d1c

2 files changed

Lines changed: 38 additions & 17 deletions

File tree

jquery.initialize.js

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@
1111
"use strict";
1212

1313
// MutationSelectorObserver represents a selector and it's associated initialization callback.
14-
var MutationSelectorObserver = function (selector, callback) {
14+
var MutationSelectorObserver = function (selector, callback, options) {
1515
this.selector = selector;
1616
this.callback = callback;
17+
this.options = options;
1718
};
1819

20+
// List of mutation types that are observable.
21+
var mtypes = ['childList', 'attributes'];
22+
1923
// List of MutationSelectorObservers.
2024
var msobservers = [];
21-
msobservers.initialize = function (selector, callback) {
25+
msobservers.initialize = function (selector, callback, options) {
2226

2327
// Wrap the callback so that we can ensure that it is only
2428
// called once per element.
@@ -34,26 +38,51 @@
3438
$(selector).each(callbackOnce);
3539

3640
// Then, add it to the list of selector observers.
37-
this.push(new MutationSelectorObserver(selector, callbackOnce));
41+
this.push(new MutationSelectorObserver(selector, callbackOnce, options));
3842
};
3943

4044
// The MutationObserver watches for when new elements are added to the DOM.
4145
var observer = new MutationObserver(function (mutations) {
4246

4347
// For each MutationSelectorObserver currently registered.
4448
for (var j = 0; j < msobservers.length; j++) {
45-
$(msobservers[j].selector).each(msobservers[j].callback);
49+
if (msobservers[j].options.scanDocument) {
50+
51+
// Scan the entire document.
52+
$(msobservers[j].selector)
53+
.each(msobservers[j].callback);
54+
} else {
55+
56+
// For each mutation.
57+
for (var m = 0; m < mutations.length; m++) {
58+
// If mutation type is observed.
59+
if ($.inArray(mutations[m].type, mtypes) != -1) {
60+
for (var n = 0; n < mutations[m].addedNodes.length; n++) {
61+
$(mutations[m].addedNodes[n]).find(msobservers[j].selector)
62+
.addBack(msobservers[j].selector)
63+
.each(msobservers[j].callback);
64+
}
65+
}
66+
}
67+
}
4668
}
4769
});
4870

4971
// Observe the entire document.
5072
observer.observe(document.documentElement, {childList: true, subtree: true, attributes: true});
5173

5274
// Deprecated API (does not work with jQuery >= 3.1.1):
53-
$.fn.initialize = function (callback) {
54-
msobservers.initialize(this.selector, callback);
75+
$.fn.initialize = function (callback, options) {
76+
msobservers.initialize(this.selector, callback, $.extend({}, $.initialize.defaults, options));
5577
};
56-
$.initialize = function (selector, callback) {
57-
msobservers.initialize(selector, callback);
78+
79+
// Supported API
80+
$.initialize = function (selector, callback, options) {
81+
msobservers.initialize(selector, callback, $.extend({}, $.initialize.defaults, options));
5882
};
83+
84+
$.initialize.defaults = {
85+
scanDocument: true
86+
}
87+
5988
})(jQuery);

jquery.initialize.min.js

Lines changed: 1 addition & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)