跨域之三:降域 和 postMessage

2017-02-16  本文已影响0人  NathanYangcn

本节内容:实现跨域常用的两种方式 —— 降域 和 postMessage

零:跨域报错展示

在非同源情况下,操作 ifream 引入的元素时,浏览器会阻止这一操作,并且报错如下:


跨域报错 —— ifream
127.0.0.1 localhost
127.0.0.1 a.yang.com
127.0.0.1 b.yang.com
127.0.0.1 yang.com
127.0.0.1 a.com
127.0.0.1 b.com

一、降域

降域仍是解决跨域问题的一种方案,通过双向设置 document.domain 的值,解决主域名下的跨域问题。

自己动手,丰衣足食。我来手动演练一番。

var input = document.querySelector('.main input');
input.addEventListener('input', function () {
        console.log('window:' + this.value);
        window.frames[0].document.querySelector('input').value = this.value;
});
document.domain = 'yang.com';

B 页面代码 b.yang.com

    var input = document.querySelector('input');
    input.addEventListener('input', function () {
        console.log('iframe:'+ this.value);
        window.parent.document.querySelector('input').value = this.value;
    });
    document.domain = 'yang.com';

1)同源情况下:window.frames[0].document.querySelector('input') 可取到 ifream 中的 input 元素
2)非同源情况下:因为同源策略的限制,无法取到相应元素,会报错

二、postMessage

因为降域的局限性比较大,只能使用到有降域空间的域名上,那么当两个主域名完全不同时,应该如何处理呢?来看看新方法 postMessage。

自己动手,丰衣足食。我来手动演练一番。

        var input = document.querySelector('.main input');
        input.addEventListener('input', function () {
            console.log('window:' + this.value);
            window.frames[0].postMessage(this.value, '*');
        });

        window.addEventListener('message', function (e) {
            console.log('window:'+ e.data);
            input.value = e.data;
        })

B 页面代码 b.com

    var input = document.querySelector('input');
    input.addEventListener('input', function () {
        console.log('iframe:'+ this.value);
        window.parent.postMessage(this.value, 'http://a.com:8080');
    });

    window.addEventListener('message', function (e) {
        console.log('ifream:'+ e.data);
        input.value = e.data;
    })

最后:降域和 postMessage 都是小众的降域方式,并不是经常使用,若有需求可按需选择

本文章著作权归饥人谷和本人所有,转载须说明来源!

上一篇 下一篇

猜你喜欢

热点阅读