最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端百题斩【025】——原来跨域也是可以进行分类的

    正文概述 掘金(执鸢者)   2021-07-04   379

    25.1 同源策略

    前端百题斩【025】——原来跨域也是可以进行分类的

    25.1.1 同源

    // 非同源:协议不同
    http://www.baidu.com
    https://www.baidu.com
    
    // 同源:协议、域名、端口号都相同
    http://www.baidu.com
    http://www.baidu.com?query=1
    

    25.1.2 同源策略

    25.1.3 同源策略的表现

    1. DOM层面

    同源策略限制了来自不同源的JavaScript脚本对当前DOM对象读和写的操作。

    1. 数据层面

    同源策略限制了不同源的站点读取当前站点的Cookie、IndexedDB、localStorage等数据。

    1. 网络层面

    同源策略限制了通过XMHttpRequest等方式将站点的数据发送给不同源的站点。

    25.2 跨域分类

    25.2.1 DOM层面和数据层面分类

    1. 片段标识符
    // 父页面parentHtml.html
    <!DOCTYPE html>
    <html lang="zh">
        <head>
            <title></title>
        </head>
        <body>
            我是父页面
            <button id='btn'>父传给子</button>
            <iframe src="./childHtml.html" id="childHtmlId"></iframe>
        </body>
        <script>
            window.onhashchange = function() {
                console.log(decodeURIComponent(window.location.hash));
            };
            document.getElementById('btn').addEventListener('click', () => {
                const iframeDom = document.getElementById('childHtmlId');
                iframeDom.src += '#父传给子';
            });
        </script>
    </html>
    
    // 子页面childHtml.html
    <!DOCTYPE html>
    <html lang="zh">
        <head>
            <title></title>
        </head>
        <body>
            我是子页面
            <button id='btn'>子传给父</button>
        </body>
        <script>
            window.onhashchange = function() {
                console.log(decodeURIComponent(window.location.hash));
            };
    
            document.getElementById('btn').addEventListener('click', () => {
                parent.location.href += '#子传给父';
            });
        </script>
    </html>
    
    1. window.name
    1. document.domain
    1. postMessage(强烈推荐)
    // 父页面
    <!DOCTYPE html>
    <html lang="zh">
        <head>
            <title></title>
        </head>
        <body>
            我是父页面
            <button id='btn'>父传给子</button>
            <iframe src="http://127.0.0.1:5500/024/childHtml.html" id="childHtmlId"></iframe>
        </body>
        <script>
            window.addEventListener('message', function(event) {
                console.log('父页面接收到信息', event.data);
            });
            document.getElementById('btn').addEventListener('click', () => {
                const iframeDom = document.getElementById('childHtmlId');
                iframeDom.contentWindow.postMessage('我是执鸢者1', 'http://127.0.0.1:5500/024/childHtml1.html');
            });
        </script>
    </html>
    
    // 子页面
    <!DOCTYPE html>
    <html lang="zh">
        <head>
            <title></title>
        </head>
        <body>
            我是子页面
            <button id='btn'>子传给父</button>
        </body>
        <script>
            window.addEventListener('message', function(event) {
                console.log('子页面接收到信息', event.data);
            });
    
            document.getElementById('btn').addEventListener('click', () => {
                parent.postMessage('我是执鸢者2', 'http://127.0.0.1:5500/024/parentHtml1.html');
            });
        </script>
    </html>
    

    25.2.2 网络层面

    1. 通过代理实现
    1. JSONP的方式(具体实现见后续百题斩)

    (1)src属性能够访问任何URL资源,并不会受到同源策略的限制;

    (2)如果访问的资源包含JavaScript代码,其会在下载后自动执行。

    1. CORS方式(具体实现见后续百题斩)

    (1)html页面内容

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>test CORS</title>
        </head>
        <body>
            CORS
            <script src="https://code.bdstatic.com/npm/axios@0.20.0/dist/axios.min.js"></script>
            <script>
                axios('http://127.0.0.1:8010', {
                    method: 'get'
                }).then(console.log)
            </script>
        </body>
    </html>
    

    (2)服务器端代码

    const express = require('express');
    
    const app = express();
    
    app.get('/', (req, res) => {
        console.log('get请求收到了!!!');
        res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:8009');
        res.send('get请求已经被处理');
    })
    app.listen(8010, () => {
        console.log('8010 is listening')
    });
    

    1.如果觉得这篇文章还不错,来个分享、点赞吧,让更多的人也看到

    2.关注公众号执鸢者,与号主一起斩杀前端百题


    起源地下载网 » 前端百题斩【025】——原来跨域也是可以进行分类的

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元