1.1.0 • Published 7 years ago

iframe_bridge v1.1.0

Weekly downloads
2
License
ISC
Repository
github
Last release
7 years ago

IFrameBridge

Very basic wrapper around window.postMessage. Handles handshaking and JSON conversion. Makes sure you don't lose any messages.

Install from npm:

npm install --save iframe_bridge

Then in your ES6+ code:

const IFrameBridge = require('iframe_bridge');

or

import IFrameBridge from 'iframe_bridge';

Usage

iframe_bridge.js file is the compiled browser-ready version of the library. If you reference it with <script> tag, the constructor will become available globally as window.BrowserBridge. You can also require it from within an ES6 app with your own build system (see above).

Example usage:

(index.html)

<script src="../dist/iframe_bridge.js"></script>

<iframe id="iframe" src="iframe.html"></iframe>

<script>
	var iFrame = document.getElementById('iframe');

	// Create an instance of bridge. By giving it iFrame's window as targetWindow,
	// you indicate this instance will work in "server mode",
	// and attempt to initiate connection. 
	var bridge = new IFrameBridge({
		targetWindow: iFrame.contentWindow
	});
	
	
	// You then attach your event handlers. You should do this before calling init.
	bridge.on('response_from_iframe', (data) => {
		console.log(data); // "Hello back"
	});

	// Once you call init, we will start trying to connect to the iframe
	// If you want to wait, just attach .then() to this call, it will return a promise.
	bridge.init();
	
	// Any messages you post here, before we are connected, will be queued
	// and flushed once connection is established.
	bridge.postMessage('event_from_parent', {
		message: 'Hello'
	});
</script>

(iframe.html)

<script src="../dist/iframe_bridge.js"></script>

<script>
	// Create an instance of the bridge without giving it targetWindow.
	// The parent's window will be determined from the handshake message.
	var bridge = new IFrameBridge();
	
	// You can also listen to the generic "message" event. You will get all received events here.
	bridge.on('message', (payload) => {
		if (payload.name === 'event_from_parent' && payload.data.message === 'Hello') {
			bridge.postMessage('response_from_iframe', 'Hello back');
		}
	});
	
	// Call init to start listening for handshake
	bridge.init();
</script>

You can see a working example here: tester/index.html.

Additional options

Check out DEFAULT_OPTIONS inside IFrameBridge.js for the full list with comments.

This object will be available (and mutable) on IFrameBridge.DEFAULT_OPTIONS.

License

MIT