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