Giter Site home page Giter Site logo

postmessagebus's Introduction

PostMessageBus

跨iframe通信小工具, 要求浏览器支持 Proxy (如果浏览器不支持Proxy, 可以使用Google提供的proxy-polyfill) 和 URLSearchParams.

Install

npm install post-message-bus

或者直接引用

<script src="https://blog.alanwei.com/PostMessageBus/dist/post-message-bus.umd.js"></script>

Use

点击访问例子1

/**
 * 父级页面
 */ 
var parentBus = PostMessageBus.generateBusToFrame("child.html", {
    // 这里定义父级页面的方法, 供子页面调用
    greet: function (name, child) {
        // 这里可以继续使用 child 调用iframe中定义的方法
        return child.getPosition().then(function (pos) {
            // pos => /test/one/child.html
            return `你好${name}, 我知道你来自${pos}. 我叫哈哈.`;
        });
    }
});
parentBus.then(function ({ request }) {
    // 这里可以使用 request 调用子页面定义的方法
    log("子页面加载完成");
});
// 将iframe添加到文档中
document.body.append(parentBus.frame);

/**
 * iframe嵌套的子页面
 */
var childBus = PostMessageBus.generateBusToParent({
    // 这里定义的子页面的方法, 供父级页面调用
    getPosition: function (data, parent) {
        // 这里可以使用 parent 继续调用父级页面定义的方法
        return Promise.resolve(location.pathname); //模拟Ajax调用
    }
});
childBus.greet("呵呵").then(function (val) {
    log(val); //=> 你好呵呵, 我知道你来自/test/one/child.html. 我叫哈哈.
});

点击访问 例子2:

父页面使用以下代码初始化:

 var bus1 = PostMessageBus.generateBusToFrame("child2.html", {
    echo: function (from, req) {
        log(`received echo ${from}`);
        return req.getName().then(name => `Hello ${name}`); // 支持返回 Promise
    }
    // 更多响应方法
});
document.body.append(bus1.frame); //将iframe添加到当前文档.
bus1.then(({request}) => {
    log("child1.html is ready"); // 子页面加载完成.
    /**
     * 这里可以使用 request 直接调用iframe内的方法, 比如: 
     * request.sendData("some data").then(iframeResponseData => "send successed");
     */
    request.getName().then(name => name === "Tim Cook") // true
});

子iframe页面使用以下代码初始化:

const bus = PostMessageBus.generateBusToParent({
    getName: function () {
        return "Tim Cook";
    },
    sendData: function (d) {
        log(`received parent data: ${d}`);
    }
});
/**
 * bus 可以调用parent内定义的响应方法:
 */ 
bus.echo(location.href).then(greet => log(greet));

postmessagebus's People

Contributors

alanwei43 avatar

Stargazers

wotermelon avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.