|
6 | 6 | ;
|
7 | 7 | (function() {
|
8 | 8 |
|
| 9 | + var isFrameBasedUpdate = 'requestAnimationFrame' in window; |
| 10 | + var isIE = navigator.userAgent.match(/Trident/); |
| 11 | + |
9 | 12 | /**
|
10 | 13 | * Class for dimension change detection.
|
11 | 14 | *
|
|
48 | 51 | }
|
49 | 52 | }
|
50 | 53 |
|
| 54 | + var elementType = Object.prototype.toString.call(element); |
| 55 | + |
51 | 56 | /**
|
52 | 57 | *
|
53 | 58 | * @param {HTMLElement} element
|
|
57 | 62 | if (!element.resizedAttached) {
|
58 | 63 | element.resizedAttached = new EventQueue();
|
59 | 64 | element.resizedAttached.add(resized);
|
| 65 | + |
60 | 66 | } else if (element.resizedAttached) {
|
61 | 67 | element.resizedAttached.add(resized);
|
62 | 68 | return;
|
63 | 69 | }
|
64 | 70 |
|
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: hidden; z-index: -1; visibility: hidden;'; |
68 |
| - var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;'; |
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 (!{fixed: 1, absolute: 1}[getComputedStyle(element, 'position')]) { |
81 |
| - element.style.position = 'relative'; |
| 71 | + if (document.attachEvent) { |
| 72 | + //IE |
| 73 | + var checker = function() { |
| 74 | + if (!element.resizedAttached) { |
| 75 | + element.detachEvent('onresize', checker); |
| 76 | + return; |
| 77 | + } |
| 78 | + element.resizedAttached.call(); |
| 79 | + }; |
| 80 | + element.attachEvent('onresize', checker); |
| 81 | + |
| 82 | + return; |
82 | 83 | }
|
83 | 84 |
|
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 | 85 |
|
102 |
| - reset(); |
| 86 | + var resizeSensor = document.createElement('object'); |
| 87 | + resizeSensor.className = 'resize-sensor'; |
| 88 | + resizeSensor.style = |
| 89 | + 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%;' + |
| 90 | + 'transition: 0s; overflow: hidden; pointer-events: none; z-index: -1;'; |
| 91 | + |
| 92 | + if (getComputedStyle(element, 'position') == 'static') { |
| 93 | + element.style.position = 'relative'; |
| 94 | + } |
| 95 | + |
| 96 | + element.resizeSensor = resizeSensor; |
103 | 97 |
|
| 98 | + var dirty = false; |
104 | 99 | var changed = function() {
|
105 |
| - if (element.resizedAttached) { |
106 |
| - element.resizedAttached.call(); |
| 100 | + if (isFrameBasedUpdate) { |
| 101 | + dirty = true; |
| 102 | + } else { |
| 103 | + if (element.resizedAttached) { |
| 104 | + element.resizedAttached.call(); |
| 105 | + } |
107 | 106 | }
|
108 | 107 | };
|
109 | 108 |
|
110 |
| - var addEvent = function(el, name, cb) { |
111 |
| - if (el.attachEvent) { |
112 |
| - el.attachEvent('on' + name, cb); |
113 |
| - } else { |
114 |
| - el.addEventListener(name, cb); |
| 109 | + if (isFrameBasedUpdate) { |
| 110 | + function dirtyChecking() { |
| 111 | + if (dirty) { |
| 112 | + dirty = false; |
| 113 | + } |
| 114 | + |
| 115 | + if (element.resizedAttached) { |
| 116 | + element.resizedAttached.call(); |
| 117 | + } |
| 118 | + |
| 119 | + window.requestAnimationFrame(dirtyChecking); |
115 | 120 | }
|
116 |
| - }; |
117 | 121 |
|
118 |
| - var onScroll = function() { |
119 |
| - if (element.offsetWidth != lastWidth || element.offsetHeight != lastHeight) { |
120 |
| - changed(); |
121 |
| - } |
122 |
| - reset(); |
| 122 | + window.requestAnimationFrame(dirtyChecking); |
| 123 | + } |
| 124 | + |
| 125 | + resizeSensor.onload = function() { |
| 126 | + //this.contentDocument.defaultView.addEventListener('resize', changed); |
123 | 127 | };
|
124 | 128 |
|
125 |
| - addEvent(expand, 'scroll', onScroll); |
126 |
| - addEvent(shrink, 'scroll', onScroll); |
127 |
| - } |
| 129 | + resizeSensor.type = 'text/html'; |
| 130 | + if (isIE) element.appendChild(resizeSensor); |
128 | 131 |
|
129 |
| - var elementType = Object.prototype.toString.call(element); |
| 132 | + resizeSensor.data = 'about:blank'; |
| 133 | + if (!isIE) element.appendChild(resizeSensor); |
| 134 | + |
| 135 | + } |
130 | 136 | var isCollectionTyped = ('[object Array]' === elementType
|
131 | 137 | || ('[object NodeList]' === elementType)
|
132 | 138 | || ('[object HTMLCollection]' === elementType)
|
|
0 commit comments