Skip to content

Commit 6eaa5f9

Browse files
committed
Better cross-browser support
Adds better cross-browser support, it now uses MutationObservers only on IE11.
1 parent f051517 commit 6eaa5f9

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,19 @@ Works great on:
5858

5959
- Chrome
6060
- Firefox
61-
- IE 11 and below (tested on 11, 10, 9, 8 and 7)
61+
- IE 10 and below (tested on 10, 9, 8 and 7)
62+
63+
Works but limited:
64+
65+
- IE 11: due to lack of onresize/overflow events, it only detects changes through a MutationObserver;
66+
i.e. only javascript generated resize changes and not CSS pseudo classes e.g. :hover, CSS animations, etc.
6267

6368
Doesn't work on:
6469

6570
- ???
6671

72+
Please [let me know](https://github.com/sdecima/javascript-detect-element-resize/issues) if you test these libraries on any other browser, of if you run into issues with any of the above browsers.
73+
6774
TODO
6875
====
6976

@@ -72,6 +79,11 @@ TODO
7279

7380
Release Notes
7481
=============
82+
v0.4
83+
----
84+
85+
- Adds better cross-browser support, it now uses MutationObservers only on IE11.
86+
7587
v0.3
7688
----
7789

detect-element-resize.js

+12-9
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
* https://github.com/sdecima/javascript-detect-element-resize
55
* Sebastian Decima
66
*
7-
* version: 0.3
7+
* version: 0.4
88
**/
99

1010
(function ( $ ) {
11+
var is_above_ie10 = !(window.ActiveXObject) && "ActiveXObject" in window;
12+
var supports_mutation_observer = 'MutationObserver' in window;
13+
1114
function addFlowListener(element, type, fn){
1215
var flow = type == 'over';
1316
element.addEventListener('OverflowEvent' in window ? 'overflowchanged' : type + 'flow', function(e){
@@ -52,13 +55,13 @@
5255
};
5356

5457
function addResizeListener(element, fn){
55-
if ('MutationObserver' in window) {
58+
if (is_above_ie10 && supports_mutation_observer) {
5659
fn._mutationObserver = addResizeMutationObserver(element, fn);
5760
var events = element._mutationObservers || (element._mutationObservers = []);
5861
if (indexOf.call(events, fn) == -1) events.push(fn);
5962
} else {
60-
var resize = 'onresize' in element;
61-
if (!resize && !element._resizeSensor) {
63+
var supports_onresize = 'onresize' in element;
64+
if (!supports_onresize && !element._resizeSensor) {
6265
var sensor_style = 'position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; z-index: -1;';
6366
var sensor = element._resizeSensor = document.createElement('div');
6467
sensor.className = 'resize-sensor';
@@ -101,7 +104,7 @@
101104
}
102105
var events = element._flowEvents || (element._flowEvents = []);
103106
if (indexOf.call(events, fn) == -1) events.push(fn);
104-
if (!resize) element.addEventListener('resize', fn, false);
107+
if (!supports_onresize) element.addEventListener('resize', fn, false);
105108
element.onresize = function(e){
106109
forEach.call(events, function(fn){
107110
fn.call(element, e);
@@ -111,15 +114,15 @@
111114
};
112115

113116
function removeResizeListener(element, fn){
114-
if ('MutationObserver' in window) {
117+
if (is_above_ie10 && supports_mutation_observer) {
115118
var index = indexOf.call(element._mutationObservers, fn);
116119
if (index > -1) {
117120
var observer = element._mutationObservers[index]._mutationObserver;
118121
element._mutationObservers.splice(index, 1);
119122
observer.disconnect();
120123
}
121124
} else {
122-
var resize = 'onresize' in element;
125+
var supports_onresize = 'onresize' in element;
123126
var index = indexOf.call(element._flowEvents, fn);
124127
if (index > -1) element._flowEvents.splice(index, 1);
125128
if (!element._flowEvents.length) {
@@ -129,10 +132,10 @@
129132
if (sensor._resetPosition) element.style.position = 'static';
130133
try { delete element._resizeSensor; } catch(e) { /* delete arrays not supported on IE 7 and below */}
131134
}
132-
if (resize) element.onresize = null;
135+
if (supports_onresize) element.onresize = null;
133136
try { delete element._flowEvents; } catch(e) { /* delete arrays not supported on IE 7 and below */}
134137
}
135-
if(!resize) element.removeEventListener('resize', fn);
138+
if(!supports_onresize) element.removeEventListener('resize', fn);
136139
}
137140
};
138141

jquery.resize.js

+12-9
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
* https://github.com/sdecima/javascript-detect-element-resize
55
* Sebastian Decima
66
*
7-
* version: 0.3
7+
* version: 0.4
88
**/
99

1010
(function ( $ ) {
11+
var is_above_ie10 = !(window.ActiveXObject) && "ActiveXObject" in window;
12+
var supports_mutation_observer = 'MutationObserver' in window;
13+
1114
$.fn.resize = function(callback) {
1215
return this.each(function() {
1316
addResizeListener(this, callback);
@@ -70,13 +73,13 @@
7073
};
7174

7275
function addResizeListener(element, fn){
73-
if ('MutationObserver' in window) {
76+
if (is_above_ie10 && supports_mutation_observer) {
7477
fn._mutationObserver = addResizeMutationObserver(element, fn);
7578
var events = element._mutationObservers || (element._mutationObservers = []);
7679
if ($.inArray(fn, events) == -1) events.push(fn);
7780
} else {
78-
var resize = 'onresize' in element;
79-
if (!resize && !element._resizeSensor) {
81+
var supports_onresize = 'onresize' in element;
82+
if (!supports_onresize && !element._resizeSensor) {
8083
var sensor_style = 'position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; z-index: -1;';
8184
var sensor = element._resizeSensor = document.createElement('div');
8285
sensor.className = 'resize-sensor';
@@ -119,7 +122,7 @@
119122
}
120123
var events = element._flowEvents || (element._flowEvents = []);
121124
if ($.inArray(fn,events) == -1) events.push(fn);
122-
if (!resize) element.addEventListener('resize', fn, false);
125+
if (!supports_onresize) element.addEventListener('resize', fn, false);
123126
element.onresize = function(e){
124127
$.each(events, function(index, fn){
125128
fn.call(element, e);
@@ -129,15 +132,15 @@
129132
};
130133

131134
function removeResizeListener(element, fn){
132-
if ('MutationObserver' in window) {
135+
if (is_above_ie10 && supports_mutation_observer) {
133136
var index = $.inArray(fn, element._mutationObservers);
134137
if (index > -1) {
135138
var observer = element._mutationObservers[index]._mutationObserver;
136139
element._mutationObservers.splice(index, 1);
137140
observer.disconnect();
138141
}
139142
} else {
140-
var resize = 'onresize' in element;
143+
var supports_onresize = 'onresize' in element;
141144
var index = $.inArray(fn, element._flowEvents);
142145
if (index > -1) element._flowEvents.splice(index, 1);
143146
if (!element._flowEvents.length) {
@@ -147,10 +150,10 @@
147150
if (sensor._resetPosition) element.style.position = 'static';
148151
try { delete element._resizeSensor; } catch(e) { /* delete arrays not supported on IE 7 and below */}
149152
}
150-
if (resize) element.onresize = null;
153+
if (supports_onresize) element.onresize = null;
151154
try { delete element._flowEvents; } catch(e) { /* delete arrays not supported on IE 7 and below */}
152155
}
153-
if(!resize) element.removeEventListener('resize', fn);
156+
if(!supports_onresize) element.removeEventListener('resize', fn);
154157
}
155158
};
156159

0 commit comments

Comments
 (0)