|
15 | 15 | * @constructor
|
16 | 16 | */
|
17 | 17 | this.ResizeSensor = function(element, callback) {
|
18 |
| - /** |
19 |
| - * Adds a listener to the over/under-flow event. |
20 |
| - * |
21 |
| - * @param {HTMLElement} element |
22 |
| - * @param {Function} callback |
23 |
| - */ |
24 |
| - function addResizeListener(element, callback) { |
25 |
| - if (window.OverflowEvent) { |
26 |
| - //webkit |
27 |
| - element.addEventListener('overflowchanged', function(e) { |
28 |
| - callback.call(this, e); |
29 |
| - }); |
30 |
| - } else { |
31 |
| - element.addEventListener('overflow', function(e) { |
32 |
| - callback.call(this, e); |
33 |
| - }); |
34 |
| - element.addEventListener('underflow', function(e) { |
35 |
| - callback.call(this, e); |
36 |
| - }); |
37 |
| - } |
38 |
| - } |
39 |
| - |
40 | 18 | /**
|
41 | 19 | *
|
42 | 20 | * @constructor
|
|
84 | 62 | return;
|
85 | 63 | }
|
86 | 64 |
|
87 |
| - if ('onresize' in element && 11 > document.documentMode) { |
88 |
| - //internet explorer up to 10 |
89 |
| - if (element.attachEvent) { |
90 |
| - element.attachEvent('onresize', function() { |
91 |
| - element.resizedAttached.call(); |
92 |
| - }); |
93 |
| - } else if (element.addEventListener) { |
94 |
| - element.addEventListener('resize', function(){ |
95 |
| - element.resizedAttached.call(); |
96 |
| - }); |
97 |
| - } |
98 |
| - } else { |
99 |
| - var myResized = function() { |
100 |
| - if (setupSensor()) { |
101 |
| - element.resizedAttached.call(); |
102 |
| - } |
103 |
| - }; |
104 |
| - element.resizeSensor = document.createElement('div'); |
105 |
| - element.resizeSensor.className = 'resize-sensor'; |
106 |
| - var style = |
107 |
| - 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1;'; |
108 |
| - element.resizeSensor.style.cssText = style; |
109 |
| - element.resizeSensor.innerHTML = |
110 |
| - '<div class="resize-sensor-overflow" style="' + style + '">' + |
111 |
| - '<div></div>' + |
112 |
| - '</div>' + |
113 |
| - '<div class="resize-sensor-underflow" style="' + style + '">' + |
114 |
| - '<div></div>' + |
115 |
| - '</div>'; |
116 |
| - element.appendChild(element.resizeSensor); |
117 |
| - |
118 |
| - if ('absolute' !== getComputedStyle(element, 'position')) { |
119 |
| - element.style.position = 'relative'; |
| 65 | + element.resizeSensor = document.createElement('div'); |
| 66 | + element.resizeSensor.className = 'resize-sensor'; |
| 67 | + var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: scroll; z-index: -1; visibility: hidden;'; |
| 68 | + var styleChild = 'position: absolute; left: 0; top: 0;'; |
| 69 | + |
| 70 | + element.resizeSensor.style.cssText = style; |
| 71 | + element.resizeSensor.innerHTML = |
| 72 | + '<div class="resize-sensor-expand" style="' + style + '">' + |
| 73 | + '<div style="' + styleChild + '"></div>' + |
| 74 | + '</div>' + |
| 75 | + '<div class="resize-sensor-shrink" style="' + style + '">' + |
| 76 | + '<div style="' + styleChild + ' width: 200%; height: 200%"></div>' + |
| 77 | + '</div>'; |
| 78 | + element.appendChild(element.resizeSensor); |
| 79 | + |
| 80 | + if ('absolute' !== getComputedStyle(element, 'position')) { |
| 81 | + element.style.position = 'relative'; |
| 82 | + } |
| 83 | + |
| 84 | + var expand = element.resizeSensor.childNodes[0]; |
| 85 | + var expandChild = expand.childNodes[0]; |
| 86 | + var shrink = element.resizeSensor.childNodes[1]; |
| 87 | + var shrinkChild = shrink.childNodes[0]; |
| 88 | + |
| 89 | + var lastWidth, lastHeight; |
| 90 | + |
| 91 | + var reset = function() { |
| 92 | + expandChild.style.width = expand.offsetWidth + 10 + 'px'; |
| 93 | + expandChild.style.height = expand.offsetHeight + 10 + 'px'; |
| 94 | + expand.scrollLeft = expand.scrollWidth; |
| 95 | + expand.scrollTop = expand.scrollHeight; |
| 96 | + shrink.scrollLeft = shrink.scrollWidth; |
| 97 | + shrink.scrollTop = shrink.scrollHeight; |
| 98 | + lastWidth = element.offsetWidth; |
| 99 | + lastHeight = element.offsetHeight; |
| 100 | + }; |
| 101 | + |
| 102 | + reset(); |
| 103 | + |
| 104 | + var changed = function() { |
| 105 | + element.resizedAttached.call(); |
| 106 | + }; |
| 107 | + |
| 108 | + var addEvent = function(el, name, cb) { |
| 109 | + if (el.attachEvent) { |
| 110 | + el.attachEvent('on' + name, cb); |
| 111 | + } else { |
| 112 | + el.addEventListener(name, cb); |
120 | 113 | }
|
| 114 | + }; |
121 | 115 |
|
122 |
| - var x = -1, |
123 |
| - y = -1, |
124 |
| - firstStyle = element.resizeSensor.firstElementChild.firstChild.style, |
125 |
| - lastStyle = element.resizeSensor.lastElementChild.firstChild.style; |
126 |
| - |
127 |
| - function setupSensor() { |
128 |
| - var change = false, |
129 |
| - width = element.resizeSensor.offsetWidth, |
130 |
| - height = element.resizeSensor.offsetHeight; |
131 |
| - |
132 |
| - if (x != width) { |
133 |
| - firstStyle.width = (width - 1) + 'px'; |
134 |
| - lastStyle.width = (width + 1) + 'px'; |
135 |
| - change = true; |
136 |
| - x = width; |
137 |
| - } |
138 |
| - if (y != height) { |
139 |
| - firstStyle.height = (height - 1) + 'px'; |
140 |
| - lastStyle.height = (height + 1) + 'px'; |
141 |
| - change = true; |
142 |
| - y = height; |
143 |
| - } |
144 |
| - return change; |
| 116 | + addEvent(expand, 'scroll', function() { |
| 117 | + if (element.offsetWidth > lastWidth || element.offsetHeight > lastHeight) { |
| 118 | + changed(); |
145 | 119 | }
|
| 120 | + reset(); |
| 121 | + }); |
146 | 122 |
|
147 |
| - setupSensor(); |
148 |
| - addResizeListener(element.resizeSensor, myResized); |
149 |
| - addResizeListener(element.resizeSensor.firstElementChild, myResized); |
150 |
| - addResizeListener(element.resizeSensor.lastElementChild, myResized); |
151 |
| - } |
| 123 | + addEvent(shrink, 'scroll',function() { |
| 124 | + if (element.offsetWidth < lastWidth || element.offsetHeight < lastHeight) { |
| 125 | + changed(); |
| 126 | + } |
| 127 | + reset(); |
| 128 | + }); |
152 | 129 | }
|
153 | 130 |
|
154 | 131 | if ('array' === typeof element
|
|
0 commit comments