comparison iframe-resizer/README.md @ 0:ac5f9272033b draft

first upload
author saskia-hiltemann
date Tue, 01 Jul 2014 11:42:23 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:ac5f9272033b
1 # iFrame Resizer
2 [![Bower version](https://badge.fury.io/bo/iframe-resizer.png)](http://badge.fury.io/bo/iframe-resizer) [![Build Status](https://travis-ci.org/davidjbradshaw/iframe-resizer.png?branch=master)](https://travis-ci.org/davidjbradshaw/iframe-resizer) [![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
3
4 This library enables the automatic resizing of the height and width of both same and cross domain iFrames to fit the contained content. It uses [postMessage](https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage) to pass messages between the host page and the iFrame and when available [MutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver) to detect DOM changes, with a fallback to setInterval for IE8-10.
5
6 The code also detects browser events that can cause the content to resize; provides functions to allow the iFrame to set a custom size and close itself. Plus it supports having multiple iFrames on the host-page and additionally provides for the sending of simple messages from the iFrame to the parent page.
7
8 For security, by default the host-page automatically checks that the origin of incoming messages are from the domain of the page listed in the `src` property of the iFrame.
9
10 The package contains two minified JavaScript files in the [js](js) folder. The first ([iframeResizer.min.js](https://raw2.github.com/davidjbradshaw/iframe-resizer/master/js/iframeResizer.min.js)) is for the page hosting the iFrames. It can be called with **native** JavaScript;
11
12 ```js
13 iFrameResize([{options}],[selector]);
14 ```
15
16 or via **jQuery**. (See [notes](#browser-compatibility) below for using native version with IE8).
17
18 ```js
19 $('iframe').iFrameResize([{options}]);
20 ```
21
22 The second file ([iframeResizer.contentWindow.min.js](https://raw.github.com/davidjbradshaw/iframe-resizer/master/js/iframeResizer.contentWindow.min.js)) is a **native** JavaScript file that needs placing in the page contained within your iFrame. <i>This file is designed to be a guest on someone else's system, so has no dependancies and won't do anything until it's activated by a message from the containing page</i>.
23
24 ### Typical setup
25
26 The normal configuration is to have the iFrame resize when the browser window changes size or the content of the iFrame changes. To set this up you need to configure one of the dimensions of the iFrame to a percentage and tell the library only to update the other dimension. Normally you would set the width to 100% and have the height scale to fit the content.
27
28 ```html
29 <iframe src="http://anotherdomain.com/frame.content.html" width="100%" scrolling="no"></iframe>
30 ```
31
32 Note that scrolling is set to 'no', as older versions of IE don't allow this to be turned off in code and can just slightly add a bit of extra space to the bottom of the content that it doesn't report when it returns the height. If you have problems, check the [troubleshooting](#troubleshooting) section below.
33
34 ###Example
35 To see this working take a look at this [example](http://davidjbradshaw.com/iframe-resizer/example/) and watch the [console](https://developer.mozilla.org/en-US/docs/Tools/Web_Console).
36
37 ## Options
38
39 ### log
40
41 default: false
42 type: boolean
43
44 Setting the `log` option to true will make the scripts in both the host page and the iFrame output everything they do to the JavaScript console so you can see the communication between the two scripts.
45
46 ### autoResize
47
48 default: true
49 type: boolean
50
51 When enabled changes to the Window size or the DOM will cause the iFrame to resize to the new content size. Disable if using size method with custom dimensions.
52
53 ### bodyBackground
54
55 default: null
56 type: string
57
58 Override the body background style in the iFrame.
59
60 ### bodyMargin
61
62 default: null
63 type: string || number
64
65 Override the default body margin style in the iFrame. A string can be any valid value for the CSS margin attribute, for example '8px 3em'. A number value is converted into px.
66
67 ### checkOrigin
68
69 default: true
70 type: boolean
71
72 When set to true, only allow incoming messages from the domain listed in the `src` property of the iFrame tag. If your iFrame navigates between different domains, ports or protocols; then you will need to disable this option.
73
74 ### enablePublicMethods
75
76 default: false
77 type: boolean
78
79 If enabled, a `window.parentIFrame` object is created in the iFrame that contains methods outlined [below](#iframe-methods).
80
81 ### interval
82
83 default: 32 (in ms)
84 type: number
85
86 In browsers that don't support [mutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver), such as IE10, the library falls back to using setInterval, to check for changes to the page size. The default value is equal to two frame refreshes at 60Hz, setting this to a higher value will make screen redraws noticeable to the user.
87
88 Setting this property to a negative number will force the interval check to run instead of [mutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver).
89
90 Set to zero to disable.
91
92 ### heightCalculationMethod
93
94 default: 'bodyOffset'
95 values: 'bodyOffset' | 'bodyScroll' | 'documentElementOffset' | 'documentElementScroll' |
96 'max' | 'min' | 'grow' | 'lowestElement'
97
98 By default the height of the iFrame is calculated by converting the margin of the `body` to <i>px</i> and then adding the top and bottom figures to the offsetHeight of the `body` tag.
99
100 In cases where CSS styles causes the content to flow outside the `body` you may need to change this setting to one of the following options. Each can give different values depending on how CSS is used in the page and each has varying side-effects. You will need to experiment to see which is best for any particular circumstance.
101
102 * **bodyScroll** uses `document.body.scrollHeight`
103 * **documentElementOffset** uses `document.documentElement.offsetHeight`
104 * **documentElementScroll** uses `document.documentElement.scrollHeight`
105 * **max** takes the largest value of the main four options
106 * **min** takes the smallest value of the main four options
107 * **grow** same as **max** but disables the double resize that is used to workout if the iFrame needs to shrink. This provides much better performance if your iFrame will only ever increase in size
108 * **lowestElement** Loops though every element in the the DOM and finds the lowest bottom point.
109
110 <i>Notes:</i>
111
112 <i>The **bodyScroll**, **documentElementScroll**, **max** and **min** options can cause screen flicker and will prevent the [interval](#interval) trigger downsizing the iFrame when the content shrinks. This is mainly an issue in IE 10 and below, where the [mutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver) event is not supported. To overcome this you need to manually trigger a page resize by calling the [parentIFrame.size()](#size-customheight-customwidth) method when you remove content from the page.</i>
113
114 <i>The **lowestElement** option is the most reliable way of determining the page height. However, it does have a performance impact in older versions of IE. In one screen refresh (16ms) Chrome 34 can calculate the position of around 10,000 html nodes, whereas IE 8 can calculate approximately 50. It is recommend to fallback to **max** or **grow** in IE10 and below.</i>
115
116 ### maxHeight / maxWidth
117
118 default: infinity
119 type: integer
120
121 Set maximum height/width of iFrame.
122
123 ### minHeight / minWidth
124
125 default: 0
126 type: integer
127
128 Set minimum height/width of iFrame.
129
130 ### scrolling
131
132 default: false
133 type: integer
134
135 Enable scroll bars in iFrame.
136
137 ### sizeHeight
138
139 default: true
140 type: boolean
141
142 Resize iFrame to content height.
143
144 ### sizeWidth
145
146 default: false
147 type: boolean
148
149 Resize iFrame to content width.
150
151 <!--
152 ### tolerance
153
154 default: 0
155 type: integer
156
157 Set amount iFrame content size has to change by, before triggering resize of the iFrame.
158 -->
159
160 ## Callback Methods
161
162 ### closedCallback
163
164 type: function (iframeID)
165
166 Called when iFrame is closed via `parentIFrame.close()` method.
167
168 ### initCallback
169
170 type: function (iframe)
171
172 Initial setup callback function.
173
174 ### messageCallback
175
176 type: function ({iframe,message})
177
178 Receive message posted from iFrame with the `parentIFrame.sendMessage()` method.
179
180 ### resizedCallback
181
182 type: function ({iframe,height,width,type})
183
184 Function called after iFrame resized. Passes in messageData object containing the **iFrame**, **height**, **width** and the **type** of event that triggered the iFrame to resize.
185
186
187 ## IFrame Methods
188
189 To enable these methods you must set [enablePublicMethods](#enablepublicmethods) to **true**. This creates the `window.parentIFrame` object in the iFrame. These method should be contained by a test for the `window.parentIFrame` object, in case the page is not loaded inside an iFrame. For example:
190
191 ```js
192 if ('parentIFrame' in window) {
193 parentIFrame.close();
194 }
195 ```
196
197 ### close()
198
199 Remove the iFrame from the parent page.
200
201 ### getId()
202
203 Returns the ID of the iFrame that the page is contained in.
204
205 ### sendMessage(message,[targetOrigin])
206
207 Send string to the containing page. The message is delivered to the `messageCallback` function. The `targetOrigin` option is used to restrict where the message is sent to; to stop an attacker mimicking your parent page. See the MDN documentation on [postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) for more details.
208
209 ### setHeightCalculationMethod(heightCalculationMethod)
210
211 Change the method use to workout the height of the iFrame.
212
213 ### size ([customHeight],[ customWidth])
214
215 Manually force iFrame to resize. This method optionally accepts two arguments: **customHeight** & **customWidth**. To use them you need first to disable the `autoResize` option to prevent auto resizing and enable the `sizeWidth` option if you wish to set the width.
216
217 ```js
218 iFrameResize({
219 autoResize: false,
220 enablePublicMethods: true,
221 sizeWidth: true
222 });
223 ```
224
225 Then you can call the `size` method with dimensions:
226
227 ```js
228 if ('parentIFrame' in window) {
229 parentIFrame.size(100); // Set height to 100px
230 }
231 ```
232
233
234 ##Troubleshooting
235
236 The first step to investigate a problem is to enable the [log](#log) option and then open the [JavaScript Console](https://developers.google.com/chrome-developer-tools/docs/console#opening_the_console). This will enable you to see what both the iFrame and host page are up to and also see any JavaScript error messages.
237
238 Solutions for the most common problems are outlined in this section.
239
240 ### IFrame not sizing correctly
241 If a larger element of content is removed from the normal document flow, through the use of absolute positioning, it can prevent the browser working out the correct size of the page. In such cases you can change the [heightCalculationMethod](#heightcalculationmethod) to uses one of the other sizing methods, normally you will be best off selecting the **max** or **lowestElement** options to avoid cross browser differences.
242
243 ###IFrame not detecting CSS :hover events
244 If your page resizes via CSS `:hover` events, these won't be detect by default. It is however possible to create `mouseover` and `mouseout` event listeners on the elements that are resized via CSS and have these events call the [parentIFrame.size()](##parentiframesize-customheight-customwidth) method. With jQuery this can be done as follows, once you have set the [enablePublicMethods](#enablepublicmethods) option to **true**.
245
246 ```js
247 function resize(){
248 if ('parentIFrame' in window) {
249 setTimeout(function(){ // Fix FireFox timing issue
250 parentIFrame.size();
251 },0);
252 }
253 }
254
255 $(*Element with hover style*).hover(resize);
256 ```
257
258 ### PDF and OpenDocument Files
259 It is not possible to add the required JavaScript to PDF and ODF files. However, you can get around this limitation by using [ViewerJS](http://viewerjs.org/) to render these files inside a HTML page, that also contains the iFrame JavaScript file ([iframeResizer.contentWindow.min.js](https://raw.github.com/davidjbradshaw/iframe-resizer/master/js/iframeResizer.contentWindow.min.js)).
260
261 ### Unexpected message received error
262 By default the origin of incoming messages is checked against the `src` attribute of the iFrame. If they don't match an error is thrown. This behaviour can be disabled by setting the [checkOrigin](#checkorigin) option to **false**.
263
264
265 ## Browser compatibility
266 ###jQuery version
267
268 Works with all browsers which support [window.postMessage](http://caniuse.com/#feat=x-doc-messaging) (IE8+).
269
270 ###Native version
271
272 Additionally requires support for [Array.prototype.forEach](http://kangax.github.io/es5-compat-table/#Array.prototype.forEach) (IE9+) and [document.querySelectorAll](https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelectorAll) (IE8 Standards Mode). For **IE8** force [Standards Mode](http://en.wikipedia.org/wiki/Internet_Explorer_8#Standards_mode),
273
274 ```html
275 <meta http-equiv="X-UA-Compatible" content="IE=edge">
276 ```
277
278 and use the [MDN PolyFill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) on the host page.
279
280 ```js
281 if (!Array.prototype.forEach){
282 Array.prototype.forEach = function(fun /*, thisArg */){
283 "use strict";
284 if (this === void 0 || this === null || typeof fun !== "function") throw new TypeError();
285
286 var
287 t = Object(this),
288 len = t.length >>> 0,
289 thisArg = arguments.length >= 2 ? arguments[1] : void 0;
290
291 for (var i = 0; i < len; i++)
292 if (i in t)
293 fun.call(thisArg, t[i], i, t);
294 };
295 }
296 ```
297
298
299 ## Contributing
300 In lieu of a formal style-guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
301
302
303 ##Version History
304
305 * v2.5.0 Added *minHeight*, *maxHeight*, *minWidth* and *maxWidth* options. Added *initCallback* and *closedCallback* functions (Close event calling *resizedCallback* is deprecated). Added **grow** and **lowestElement** *heightCalculationMethods*. Added AMD support. [#52](https://github.com/davidjbradshaw/iframe-resizer/issues/52) Added *sendMessage* example. [#54](https://github.com/davidjbradshaw/iframe-resizer/issues/54) Work around IE8's borked JS execution stack. [#55](https://github.com/davidjbradshaw/iframe-resizer/issues/55) Check datatype of passed in options.
306 * v2.4.8 Fix issue when message passed to messageCallback contains a colon.
307 * v2.4.7 [#49](https://github.com/davidjbradshaw/iframe-resizer/issues/49) Deconflict requestAnimationFrame.
308 * v2.4.6 [#46](https://github.com/davidjbradshaw/iframe-resizer/issues/46) Fix iFrame event listener in IE8.
309 * v2.4.5 [#41](https://github.com/davidjbradshaw/iframe-resizer/issues/41) Prevent error in FireFox when body is hidden by CSS [[Scott Otis](/Scotis)].
310 * v2.4.4 Enable nested iFrames ([#31](https://github.com/davidjbradshaw/iframe-resizer/issues/31) Filter incoming iFrame message in host-page script. [#33](https://github.com/davidjbradshaw/iframe-resizer/issues/33) Squash unexpected message warning when using nested iFrames. Improved logging for nested iFrames). [#38](https://github.com/davidjbradshaw/iframe-resizer/issues/38) Detect late image loads that cause a resize due to async image loading in WebKit [[Yassin](/ynh)]. Fixed :Hover example in FireFox. Increased trigger timeout lock to 64ms.
311 * v2.4.3 Simplified handling of double fired events. Fixed test coverage.
312 * v2.4.2 Fix missing 'px' unit when resetting height.
313 * v2.4.1 Fix screen flicker issue with scroll height calculation methods in v2.4.0.
314 * v2.4.0 Improved handling of alternate sizing methods, so that they will now shrink on all trigger events, except *Interval*. Prevent error when incoming message to iFrame is an object.
315 * v2.3.2 Fix backwards compatibility issue between V2 iFrame and V1 host-page scripts.
316 * v2.3.1 Added setHeightCalculationMethod() method in iFrame. Added *min* option to the height calculation methods. Invalid value for *heightCalculationMethod* is now a warning rather than an error and now falls back to the default value.
317 * v2.3.0 Added extra *heightCalculationMethod* options. Inject clearFix into 'body' to work around CSS floats preventing the height being correctly calculated. Added meaningful error message for non-valid values in *heightCalculationMethod*. Stop **click** events firing for 50ms after **size** events. Fixed hover example in old IE.
318 * v2.2.3 [#26](https://github.com/davidjbradshaw/iframe-resizer/issues/26) Locally scope jQuery to $, so there is no dependancy on it being defined globally.
319 * v2.2.2 [#25](https://github.com/davidjbradshaw/iframe-resizer/issues/25) Added click listener to Window, to detect CSS checkbox resize events.
320 * v2.2.1 [#24](https://github.com/davidjbradshaw/iframe-resizer/issues/24) Prevent error when incoming message to host page is an object [[Torjus Eidet](https://github.com/torjue)].
321 * v2.2.0 Added targetOrigin option to sendMessage function. Added bodyBackground option. Expanded troubleshooting section.
322 * v2.1.1 [#16](https://github.com/davidjbradshaw/iframe-resizer/issues/16) Option to change the height calculation method in the iFrame from offsetHeight to scrollHeight. Troubleshooting section added to docs.
323 * v2.1.0 Added sendMessage() and getId() to window.parentIFrame. Changed width calculation to use scrollWidth. Removed deprecated object name in iFrame.
324 * v2.0.0 Added native JS public function, renamed script filename to reflect that jQuery is now optional. Renamed *do(Heigh/Width)* to *size(Height/Width)*, renamed *contentWindowBodyMargin* to *bodyMargin* and renamed *callback* *resizedCallback*. Improved logging messages. Stop *resize* event firing for 50ms after *interval* event. Added multiple page example. Workout unsized margins inside the iFrame. The *bodyMargin* property now accepts any valid value for a CSS margin. Check message origin is iFrame. Removed deprecated methods.
325 * v1.4.4 Fixed *bodyMargin* bug.
326 * v1.4.3 CodeCoverage fixes. Documentation improvements.
327 * v1.4.2 Fixed size(250) example in IE8.
328 * v1.4.1 Setting `interval` to a negative number now forces the interval test to run instead of [MutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver).
329 * v1.4.0 [#12](https://github.com/davidjbradshaw/iframe-resizer/issues/12) Option to enable scrolling in iFrame, off by default. [#13](https://github.com/davidjbradshaw/iframe-resizer/issues/13) Bower dependancies updated.
330 * v1.3.7 Stop *resize* event firing for 50ms after *size* event. Added size(250) to example.
331 * v1.3.6 [#11](https://github.com/davidjbradshaw/iframe-resizer/issues/11) Updated jQuery to v1.11.0 in example due to IE11 having issues with jQuery v1.10.1.
332 * v1.3.5 Documentation improvements. Added Grunt-Bump to build script.
333 * v1.3.0 IFrame code now uses default values if called with an old version of the host page script. Improved function naming. Old names have been deprecated and removed from docs.
334 * v1.2.5 Fix publish to [plugins.jquery.com](https://plugins.jquery.com).
335 * v1.2.0 Added autoResize option, added height/width values to iFrame public size function, set HTML tag height to auto, improved documentation [All [Jure Mav](https://github.com/jmav)]. Plus setInterval now only runs in browsers that don't support [MutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver) and is on by default, sourceMaps added and close() method introduced to parentIFrame object in iFrame.
336 * v1.1.1 Added event type to messageData object.
337 * v1.1.0 Added DOM [MutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver) trigger to better detect content changes in iFrame, [#7](https://github.com/davidjbradshaw/iframe-resizer/issues/7) Set height of iFrame body element to auto to prevent resizing loop, if it's set to a percentage.
338 * v1.0.3 [#6](https://github.com/davidjbradshaw/iframe-resizer/issues/6) Force incoming messages to string. Migrated to Grunt 4.x. Published to Bower.
339 * v1.0.2 [#2](https://github.com/davidjbradshaw/iframe-resizer/issues/2) mime-type changed for IE8-10.
340 * v1.0.0 Initial published release.
341
342
343 ## License
344 Copyright &copy; 2013-14 [David J. Bradshaw](https://github.com/davidjbradshaw).
345 Licensed under the [MIT license](http://opensource.org/licenses/MIT).